Отображение ранее сохраненного URI изображения - PullRequest
0 голосов
/ 03 февраля 2019

Я пытаюсь получить изображения как с камеры, так и из галереи, сделать с ними что-то еще, а затем сохранить исходный URI изображения в SharedPreferences.Я могу выбрать один из них и успешно отобразить их, но для изображений галереи, пока я не очистил память (закройте приложение из истории), я могу извлечь их из общих настроек и отобразить их в Imageview, но после закрытияприложение из истории, извлеченные URI больше не отображаются.

Я сохраняю URI следующим образом:

@Override
protected void onActivityResult(int requestCode, int resultCode,
                                Intent data) {
    if (requestCode == REQUEST_CAPTURE_IMAGE) {
        if (resultCode == RESULT_OK) {
            Uri imageUri = Uri.parse("file:" + photoFile.getAbsolutePath());
            storeInPreferences(imageUri.toString());

        } else Toast.makeText(this, "Canceled", Toast.LENGTH_SHORT).show();
    } 
    else if (requestCode == REQUEST_GALLERY) {
        if (resultCode == RESULT_OK) {
            if (data != null) {
                storeInPreferences(data.getData().toString());
            }
        } else Toast.makeText(this, "Canceled", Toast.LENGTH_SHORT).show();
    }
}

и пытаюсь показать извлеченные URI с помощью этого кода:

 Picasso.with(mContext)
           .load(Uri.parse(getStringUriFromPrefs()))
           .resize(500, 500)
           .error(R.drawable.ic_error)
           .into(holder.iv_card);

Это происходит только для изображений галереи.Те изображения, которые я получаю непосредственно с камеры, хорошо видны.

Это URI для изображения галереи: (У меня проблема с)

CONTENT://COM.ANDROID.PROVIDERS.MEDIA.DOCUMENTS/DOCUMENT/IMAGE%3A378071

, и это URI для изображения с камеры:

FILE:/STORAGE/EMULATED/0/DCIM/CAMERA/20190202_224630_2332127860148701493.JPG

Кроме того, я попробовал его на уровне API 18, и он работал хорошо. Но на уровне API 22 и 26 он не работает.Я не пробовал на других уровнях API.

1 Ответ

0 голосов
/ 03 февраля 2019

это URI для изображения галереи

Нет, это не так.Это может быть Uri после преобразования во все заглавные буквы.

и последующее сохранение URI исходного изображения в SharedPreferences

Это не будет работать надежно.Любые Uri, которые вы получаете от таких вещей, как ACTION_GET_CONTENT или ACTION_PICK , будут работать временно, независимо от того, с какими действиями вы делали эти запросы в .Uri может быть недоступен для использования где-либо еще, включая будущие копии вашего приложения.В результате сохранение Uri, подобного этому, вряд ли будет работать очень хорошо.

Либо:

  • Не сохраняйте Uri, но вместо этого сделайте копиюсамо изображение
  • Используйте ACTION_OPEN_DOCUMENT, так как тогда вы можете использовать takePersistableUriPermissions() на ContentResolver, чтобы иметь возможность использовать Uri с течением времени;или
  • Не используйте Intent для выбора изображения, вместо этого используйте библиотеку выбора файлов или что-то подобное
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...