Выбор изображения из галереи не работает на Redmi Note 4
Я видел несколько других вопросов о S/O, связанных с этим, но тот, который был ближе всего к моей проблеме, похоже, не получил много ответов ( устройство Xiaomi MI не выбирает изображение из Галереи). Надеясь на этот вопрос, повезет больше.
Я пытаюсь выбрать изображение из галереи телефона и передать путь к изображению в другой вид деятельности, где его предварительно просматривают для пользователя.
Я проверил это на двух других устройствах (Moto E и что-то под названием Coolpad?), И они оба, кажется, работают просто отлично.
(Отладка исходного кода Android не кажется практичным вариантом.)
В основном действии по триггеру пользовательского интерфейса я запускаю средство выбора галереи со следующим кодом:
private void dispatchPickPictureIntent() {
Intent pickPictureIntent = new Intent(Intent.ACTION_PICK);
pickPictureIntent.setType("image/*");
startActivityForResult(pickPictureIntent, REQUEST_IMAGE_PICK);
}
Я обрабатываю результат примерно так:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_IMAGE_PICK && resultCode == RESULT_OK) {
Uri selectedImage = data.getData();
mCurrentPhotoPath = getRealPathFromURI(this, selectedImage);
launchUploadActivity();
}
}
private String getRealPathFromURI(Context context, Uri uri) {
Cursor cursor = null;
try {
String [] proj = {MediaStore.Images.Media.DATA};
cursor = context.getContentResolver().query(uri, proj, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
} finally {
if (cursor != null)
cursor.close();
}
}
Как только я получил путь к файлу, хранящемуся в глобальной переменной mCurrentPhotoPath
вызывается следующий метод:
private void launchUploadActivity() {
Intent intent = new Intent(HomeActivity.this, UploadActivity.class);
intent.putExtra(getString(R.string.photo_path), mCurrentPhotoPath);
startActivityForResult(intent, REQUEST_IMAGE_UPLOAD);
}
Даже на Redmi, до тех пор, пока все идет гладко. В методе onCreate функции UploadActivity я успешно получаю строку пути к файлу изображения.
Но затем я пытаюсь просмотреть изображение:
private void previewPhoto() {
imageView.setVisibility(View.VISIBLE);
BitmapFactory.Options options = new BitmapFactory.Options();
// Avoid OutOfMemory Exception
options.inSampleSize = 8;
// This line returns a null, only on the Xiaomi device
final Bitmap bitmap = BitmapFactory.decodeFile(photopath, options);
imageView.setImageBitmap(bitmap);
}
Теперь я попытался отладить эту проблему, но как только я вхожу в исходный код BitmapFactory, я сталкиваюсь с, казалось бы, нерешенной проблемой Android Studio ( /questions/27858805/ishodnyij-kod-ne-sovpadaet-s-bajt-kodom-pri-otladke-na-ustrojstve/27858810#27858810), которая делает его бесполезным.
Буду очень признателен за любые указания о том, как я могу действовать отсюда.
2 ответа
Поэтому я смог сузить проблему до неправильного пути к файлу. Функция Uri to filepath не дала желаемого результата на всех устройствах.
Я использовал подход, предложенный здесь: /questions/8392818/poluchit-imya-fajla-i-put-ot-uri-iz-mediastore/8392825#8392825
и немного подправил код, чтобы при выборе изображений из галереи я использовал Uri изображения напрямую.
Причина в том, что вы возвращаете file:// uri. не content:// так что распознаватель контента не работает.
Я сталкиваюсь с подобной проблемой в Redmi 5A. И решить проблему, используя следующий способ.
Добавьте ниже лиц в вашем файле манифеста
android:hardwareAccelerated="false"
android:largeHeap="true"
Это будет работать в некоторых средах.
Ссылайтесь на ответ на /questions/10647375/androidjavalangoutofmemoryerror-ne-udalos-vyidelit-23970828-bajt-dlya-vyideleniya-s-2097152-svobodnyimi-bajtami-i-2-mb-do-oom/10647392#10647392