Android не может выбрать изображение из галереи (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));

Все необходимые разрешения в порядке. Ребята, вы понимаете, что здесь происходит? Или у вас есть лучшее предложение, что использовать, чтобы выбрать изображение из галереи?

Ответы на вопрос(3)

Шаг № 1: УдалитьByteArrayOutputStream, как вы не используете его.

Шаг № 2: УдалитьphotoPath = getPath(data.getData()); иgetPath() метод, как они не правы.

Шаг № 3: Используйтебиблиотека загрузки изображений асинхронно заполнить вашImageViewпередавая этоUri (data.getData()) изображения для загрузки. Или, катите много своего собственного кода загрузки изображения, включая разветвление фонового потока и использованиеgetContentResolver().openInputStream() чтобы получитьInputStream на содержание, определенноеUri.

 user1992203 июн. 2016 г., 14:57
я используюByteArrayOutputStream где-то еще (не показано в коде). Таким образом, любое решение, которое может быть предложено, должно учитывать это. Спасибо!
 CommonsWare03 июн. 2016 г., 14:59
@ user1992: Затем накатайте много собственного кода загрузки изображений, включая разветвление фонового потока и использованиеgetContentResolver().openInputStream() чтобы получитьInputStream на содержание, определенноеUri, Используйте это, чтобы заполнить вашByteArrayOutputStreamи использоватьbyte[] отByteArrayOutputStream а такжеBitmapFactory.decodeByteArray() создать ваше растровое изображение.

Вы можете использовать как ниже код

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...
    }
}
 CommonsWare03 июн. 2016 г., 15:00
@ user1992: вам не хватает того факта, что этот ответ используетgetContentResolver().openInputStream() чтобы получитьInputStream на содержание при поддержкеUri.
 user1992203 июн. 2016 г., 14:57
Я не вижу здесь ничего особенного? Я что-то пропустил?
Решение Вопроса

Попробуйте это вы можете напрямую установить изображение из 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();
        }
    }
}
 Vanraj Ghed04 июн. 2016 г., 07:00
@ user1992 Всегда добро пожаловать
 user1992203 июн. 2016 г., 17:48
Спасибо, парень, похоже, все в порядке. НО, не работает с большими изображениями (ок. 4МБ). Это не вызывает исключения, но либо не отображать изображение. Вместо этого он показывает серое изображение, как и изображение, которое оно слишком тяжелое для загрузки или чего-то еще. В любом случае, чтобы завершить этот ответ, чтобы преобразоватьBitmap вBytearray это помогло мне:stackoverflow.com/questions/4989182/....

Ваш ответ на вопрос