从图库和相机获取图像(Android Studio)

时间:2018-04-17 05:10:24

标签: android android-studio camera storage

我正在开发一个项目,用户可以通过拍照或从图库中选择图像来更改其个人资料图片。尽管遵循了多个教程,但他们使用的代码对我来说并不适用。每当我在Dialog Box上选择相机时,它会进入图库,然后是相机。同样,当我在对话框中选择图库时,它会转到图库但在Camera上显示图像之前仍然会转到Image View。是因为我使用的是Android Lollipop吗?我也不太确定。

如何解决此问题?

package com.example.user.imagestuff;    
import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {
     String[] Items;
     ImageView mImageView;
     Button mButton;
     final int bmpHeight = 160;
     final int bmpWidth = 160;
     static final int CAMERA_CODE = 1;
     static final int GALLERY_CODE = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mImageView = (ImageView) findViewById(R.id.mImageView);
    mButton = (Button) findViewById(R.id.mButton);
    Items = getResources().getStringArray(R.array.DialogItems);
    mButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ImageOnClick(v);
        }
    });
}

public void ImageOnClick(View v) {
    Log.i("OnClick","True");
    AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
    builder.setTitle(R.string.AlertTitle);
    builder.setItems(Items, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            for(int i=0; i < Items.length; i++){
                if (Items[i].equals("Camera")){
                    Intent CameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                    if(CameraIntent.resolveActivity(getPackageManager()) != null){
                        startActivityForResult(CameraIntent, CAMERA_CODE);
                    }

                }else if (Items[i].equals("Gallery")){
                    Log.i("GalleryCode",""+GALLERY_CODE);
                    Intent GalleryIntent = null;
                    GalleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                    GalleryIntent.setType("image/*");
                    GalleryIntent.setAction(Intent.ACTION_GET_CONTENT);
                    startActivityForResult(GalleryIntent,GALLERY_CODE);
                }
            }
        }
    });
    builder.show();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == Activity.RESULT_OK){
        switch(requestCode){
            case 1:
                Log.i("CameraCode",""+CAMERA_CODE);
                Bundle bundle = data.getExtras();
                Bitmap bmp = (Bitmap) bundle.get("data");
                Bitmap resized = Bitmap.createScaledBitmap(bmp, bmpWidth,bmpHeight, true);
                mImageView.setImageBitmap(resized);

            case 0:
                Log.i("GalleryCode",""+requestCode);
                Uri ImageURI = data.getData();
                mImageView.setImageURI(ImageURI);
        }


    }
}

}

5 个答案:

答案 0 :(得分:1)

你正在打开for循环的意图,还有一个错误就是你没有在你的开关案例中打破这种情况。在你的开关盒中使用break

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == Activity.RESULT_OK){
        switch(requestCode){
            case 1:
                Log.i("CameraCode",""+CAMERA_CODE);
                Bundle bundle = data.getExtras();
                Bitmap bmp = (Bitmap) bundle.get("data");
                Bitmap resized = Bitmap.createScaledBitmap(bmp, bmpWidth,bmpHeight, true);
                mImageView.setImageBitmap(resized);
                break;

            case 0:
                Log.i("GalleryCode",""+requestCode);
                Uri ImageURI = data.getData();
                mImageView.setImageURI(ImageURI);
                break;
        }


    }

答案 1 :(得分:1)

因为您使用for循环来检查Camera和Gallary Strings。 You need to remove for loop并尝试使用代码

您在break案例

中也遗漏了swith
final CharSequence[] items = {"Camera", "Gallery"}


                if (items[item].equals("Camera")){
                    Intent CameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                    if(CameraIntent.resolveActivity(getPackageManager()) != null){
                        startActivityForResult(CameraIntent, CAMERA_CODE);
                    }

                }else if (items[item].equals("Gallery")){
                    Log.i("GalleryCode",""+GALLERY_CODE);
                    Intent GalleryIntent = null;
                    GalleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                    GalleryIntent.setType("image/*");
                    GalleryIntent.setAction(Intent.ACTION_GET_CONTENT);
                    startActivityForResult(GalleryIntent,GALLERY_CODE);
                }

第二个选项

您还可以使用break;关键字在条件匹配时打破for循环

答案 2 :(得分:1)

请替换您的代码

try fileManager.copyfileToUserDocumentDirectory(forResource: "information",
                                                ofType: "png")
...

public void ImageOnClick(View v) {
Log.i("OnClick","True");
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle(R.string.AlertTitle);
builder.setItems(Items, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        for(int i=0; i < Items.length; i++){
            if (Items[i].equals("Camera")){
                Intent CameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                if(CameraIntent.resolveActivity(getPackageManager()) != null){
                    startActivityForResult(CameraIntent, CAMERA_CODE);
                }

            }else if (Items[i].equals("Gallery")){
                Log.i("GalleryCode",""+GALLERY_CODE);
                Intent GalleryIntent = null;
                GalleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                GalleryIntent.setType("image/*");
                GalleryIntent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(GalleryIntent,GALLERY_CODE);
            }
        }
    }
});
builder.show();
}

答案 3 :(得分:1)

你没有使用break语句,这就是为什么它转移到下一个语句。 在解雇意图时使用wb = xl.ActiveWorkbook xl.DisplayAlerts = False wb.DoNotPromptForConvert = True wb.CheckCompatibility = False wb.SaveAs('final_outfile.xlsx', FileFormat=51, ConflictResolution=2) # Macro disapears here xl.Application.Quit() del xl xl = None 语句

break

为了使其有效使用位置值,当你设置onclickListener时,它返回一个int变量,它是单击列表的位置。在你的情况下它是public void ImageOnClick (View v){ Log.i("OnClick", "True"); AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); builder.setTitle(R.string.AlertTitle); builder.setItems(Items, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { for (int i = 0; i < Items.length; i++) { if (Items[i].equals("Camera")) { Intent CameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); if (CameraIntent.resolveActivity(getPackageManager()) != null) { startActivityForResult(CameraIntent, CAMERA_CODE); } break; } else if (Items[i].equals("Gallery")) { Log.i("GalleryCode", "" + GALLERY_CODE); Intent GalleryIntent = null; GalleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); GalleryIntent.setType("image/*"); GalleryIntent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(GalleryIntent, GALLERY_CODE); } break; } } }); builder.show(); } 所以你可以简单地使用

int which

同样在OnActivityResult方法中使用 public void ImageOnClick (View v){ Log.i("OnClick", "True"); AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); builder.setTitle(R.string.AlertTitle); builder.setItems(Items, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if (Items[which].equals("Camera")) { Intent CameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); if (CameraIntent.resolveActivity(getPackageManager()) != null) { startActivityForResult(CameraIntent, CAMERA_CODE); } break; } else if (Items[which].equals("Gallery")) { Log.i("GalleryCode", "" + GALLERY_CODE); Intent GalleryIntent = null; GalleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); GalleryIntent.setType("image/*"); GalleryIntent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(GalleryIntent, GALLERY_CODE); } break; } }); builder.show(); } 语句,否则它将两种情况

break

答案 4 :(得分:0)

这对我来说很好。

public static final int CAMERA_PERMISSION =100;
public static final int REQUEST_IMAGE_CAPTURE =101;
public static final int READ_STORAGE_PERMISSION =102;
public static final int REQUEST_IMAGE_PICK =103 ;
private Dialog mCameraDialog;
private Uri mImageURI;

/**
 * Method to show list dialog to choose photo form gallery or camera.
 */
private void showChoosePhotoDialog() {
    mCameraDialog.setContentView(R.layout.dialog_choose_photo);
    if(mCameraDialog.getWindow()!=null)
        mCameraDialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    mCameraDialog.findViewById(R.id.camera).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mCameraDialog.dismiss();
            onCameraOptionSelected();
        }
    });
    mCameraDialog.findViewById(R.id.gallery).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mCameraDialog.dismiss();
            onGalleryOptionSelected();
        }
    });
    mCameraDialog.show();
}

/**
 * Method to open gallery.
 */
private void onGalleryOptionSelected() {
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
        Intent intentGallery = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(intentGallery, REQUEST_IMAGE_PICK);
        overridePendingTransition(R.anim.push_left_right, R.anim.push_right_left);
    } else {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                READ_STORAGE_PERMISSION);
    }
}

/**
 * Method to open chooser.
 */
private void onCameraOptionSelected() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA},
                        CAMERA_PERMISSION);
            } else {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, CAMERA_PERMISSION);
            }
        } else if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    CAMERA_PERMISSION);

        } else {
            mImageURI = Uri.parse(AppUtils.getFilename());
            startActivityForResult(AppUtils.getCameraChooserIntent(EditProfileActivity.this, mImageURI + ""),
                    REQUEST_IMAGE_CAPTURE);
        }
    } else {
        mImageURI = Uri.parse(AppUtils.getFilename());
        startActivityForResult(AppUtils.getCameraChooserIntent(this, mImageURI + ""),
                REQUEST_IMAGE_CAPTURE);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    switch (requestCode) {
        case CAMERA_PERMISSION:
            int j = 0;
            for (int grantResult : grantResults) {
                if (grantResult != PackageManager.PERMISSION_GRANTED)
                    j = 1;
            }
            if (j == 1) {
                if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE) || (ActivityCompat.shouldShowRequestPermissionRationale(this,
                        Manifest.permission.CAMERA))) {
                    //           Toast.makeText(this, R.string.s_camera_permission, Toast.LENGTH_SHORT).show();
                } else if (!ActivityCompat.shouldShowRequestPermissionRationale(this,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE) || !ActivityCompat.shouldShowRequestPermissionRationale(this,
                        Manifest.permission.CAMERA)) {
                    // Open phone settings page. 
                    //         Toast.makeText(this, getString(R.string.s_app_needs_camera_permission), Toast.LENGTH_SHORT).show();
                }
            } else
                onCameraOptionSelected();
            break;

        case READ_STORAGE_PERMISSION:
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED)
                onGalleryOptionSelected();
            else if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                    Manifest.permission.READ_EXTERNAL_STORAGE)) {
                //             Toast.makeText(this, getString(R.string.s_storage_permission), Toast.LENGTH_SHORT).show();
            } else if (!ActivityCompat.shouldShowRequestPermissionRationale(this,
                    Manifest.permission.READ_EXTERNAL_STORAGE)) {
                 // Open Phone Settings   
            }
    }
}