将图片路径从图库保存到 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 是否存在某种格式问题?还是其他问题?
谢谢!
以防万一其他人遇到这个问题,这是我的解决方案:
将意图从 ACTION_GET_CONTENT
更改为 ACTION_OPEN_DOCUMENT
为意图设置以下标志:
chooseFile.flags = (Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION)
在 onActivityResult
中,在将 URI 用于其他用途之前使用以下代码行:
context?.contentResolver?.takePersistableUriPermission(returnUri, Intent.FLAG_GRANT_READ_URI_PERMISSION)
我已经针对这个问题尝试了各种解决方案,但到目前为止,没有一个有效:/
我让用户从图库中挑选一张照片,让应用程序显示预览,将带有标题的图像保存到 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 是否存在某种格式问题?还是其他问题?
谢谢!
以防万一其他人遇到这个问题,这是我的解决方案:
将意图从
ACTION_GET_CONTENT
更改为ACTION_OPEN_DOCUMENT
为意图设置以下标志:
chooseFile.flags = (Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION)
在
onActivityResult
中,在将 URI 用于其他用途之前使用以下代码行:context?.contentResolver?.takePersistableUriPermission(returnUri, Intent.FLAG_GRANT_READ_URI_PERMISSION)