Сохраните путь к изображению из галереи в БД комнаты, затем загрузите с неработающим Пикассо - PullRequest
0 голосов
/ 12 июля 2020

Я пробовал различные решения этой проблемы на SO, но пока ни одно из них не помогло: /

Я разрешаю пользователям выбрать фотографию из галереи, чтобы приложение отображало предварительный просмотр , сохраните изображение с подписью в базе данных комнаты, а затем отобразите несколько изображений в RecyclerView с помощью представлений карты Google Material Design.

Выбор изображения и его отображение в предварительном просмотре не проблема. Но отображение изображений в RecyclerView с помощью Picasso не работает. Он показывает только мое изображение с ошибкой (вектор сломанного изображения).

Для выбора изображения из галереи и отображения изображения предварительного просмотра используется следующий код:

private fun choosePicture() {
    var chooseFile = Intent(Intent.ACTION_GET_CONTENT)
    chooseFile.type = MIME_TYPE_IMAGE
    chooseFile = Intent.createChooser(chooseFile, resources.getString(R.string.choose_file))
    startActivityForResult(chooseFile, PICK_FILE_RESULT_CODE)
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    when (requestCode) {
        PICK_FILE_RESULT_CODE -> if (resultCode == -1) {
            data!!.data?.let { returnUri ->
                loadPicture(returnUri)
                binding.constraintLayout.visibility = View.VISIBLE
                viewModel.imagePath.value = returnUri
            }
        }
    }
}

private fun loadPicture(uri: Uri) {
    Picasso.get()
        .load(uri)
        .error(R.drawable.ic_broken_image_gray_24dp)
        .into(binding.placeImage)
}

В моем ViewHolder I ' m, используя следующий код для отображения изображения (путь к изображению сохранен в базе данных комнаты как строка):

fun bind(location: Location) {
    textViewLocationName.text = location.name
    Picasso.get()
        .load(Uri.parse(location.imagePath!!))
        .error(R.drawable.ic_broken_image_gray_24dp)
        .into(imageViewLocation)
}

При отладке URI выглядит следующим образом: content://com.android.providers.media.documents/document/image%3A4569

Есть ли какой-то проблемы с форматированием URI? Или есть другая проблема?

Спасибо!

1 Ответ

0 голосов
/ 12 июля 2020

На случай, если у кого-то еще есть эта проблема, вот мое решение:

  1. Измените намерение с ACTION_GET_CONTENT на ACTION_OPEN_DOCUMENT

  2. Установите следующие флаги для намерения: chooseFile.flags = (Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION)

  3. В onActivityResult используйте следующую строку кода перед использованием URI для чего-либо еще: context?.contentResolver?.takePersistableUriPermission(returnUri, Intent.FLAG_GRANT_READ_URI_PERMISSION)

...