将图片路径从图库保存到 Room DB,然后在 Picasso 不工作的情况下加载

Save image path from gallery to Room DB, then load with Picasso not working

我已经针对这个问题尝试了各种解决方案,但到目前为止,没有一个有效:/

我让用户从图库中挑选一张照片,让应用程序显示预览,将带有标题的图像保存到 Room DB,然后使用 Google 在 RecyclerView 中显示多张图像Material 设计卡片浏览量。

选择一张图片并在预览中显示它不是问题。但是使用 Picasso 在 RecyclerView 中显示图像是行不通的。它只显示我的错误图像(损坏的图像矢量)。

以下代码用于从图库中选取图像并显示预览图像:

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 中,我使用以下代码显示图像(图像路径以字符串形式保存在 Room DB 中):

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. 将意图从 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)