Android 从图库中选择图像不起作用(Android 6.0 和 Android 5.1.1)

Android pick image from gallery not working (Android 6.0 & Android 5.1.1)

我正在使用下面的代码从设备库中选择一个图像文件:

首先我调用这段代码:

Intent i = new Intent();
i.setType("image/*");
i.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(i, "Select Picture"), RESULT_LOAD_IMAGE);

这是我的onActivityResult方法:

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) {

            photoPath  = getPath(data.getData());
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            FileInputStream fis;
            try {
                fis = new FileInputStream(new File(photoPath));
                byte[] buf = new byte[1024];
                int n;
                while (-1 != (n = fis.read(buf))) {
                    baos.write(buf, 0, n);
                }

                img.setImageBitmap(BitmapFactory.decodeFile(photoPath));

            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }

这是一个检索图像路径的辅助方法:

private String getPath(Uri uri) {

        String[]  data = { MediaStore.Images.Media.DATA };
        CursorLoader loader = new CursorLoader(getApplicationContext(), uri, data, null, null, null);
        Cursor cursor = loader.loadInBackground();
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }

我的问题是应用程序很奇怪。在我的 6.0 模拟器中,有时有效,有时无效。在其他设备 (Android 5.1.1) 中,在这一行

抛出一个 FileNotFound Exception

fis = new FileInputStream(new File(photoPath));

所有必需的权限都是 fine.Do 你们知道这里发生了什么吗?或者您有什么更好的建议可以用来从图库中挑选图像吗?

第 1 步:删除 ByteArrayOutputStream,因为您没有使用它。

步骤 #2:删除 photoPath = getPath(data.getData());getPath() 方法,因为它们是错误的。

第 3 步:使用 an image loading library 异步填充您的 ImageView,将其传递给要加载的图像的 Uri (data.getData())。或者,滚动大量您自己的图像加载代码,包括分叉后台线程并使用 getContentResolver().openInputStream()Uri.

标识的内容上获取 InputStream

你可以像下面的代码一样使用

public void pickImage() {
  Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
  intent.setType("image/*");
  startActivityForResult(intent, PICK_PHOTO_FOR_AVATAR);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == PICK_PHOTO_FOR_AVATAR && resultCode == Activity.RESULT_OK) {
        if (data == null) {
            //Display an error
            return;
        }
        InputStream inputStream = context.getContentResolver().openInputStream(data.getData());
        //Now you can do whatever you want with your inpustream, save it as file, upload to a server, decode a bitmap...
    }
}

试试这个你可以直接从onActivityResult设置图片

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) {
try{
            final Uri imageUri = data.getData();
            final InputStream imageStream = getContentResolver().openInputStream(imageUri);
            final Bitmap selectedImage = BitmapFactory.decodeStream(imageStream);

            imageView.setImageBitmap(selectedImage);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

//你在片段中所以使用下面的代码希望它的工作 最终 Uri imageUri = data.getData();

            final InputStream imageStream =getActivity().getContentResolver().openInputStream(imageUri);

            final Bitmap selectedImage = BitmapFactory.decodeStream(imageStream);