java - Android - 使用 action_view 意图打开本地图像 uri
问题描述
我正在开发旧的 Android Java 应用程序。现在我遇到了通过 action_view 意图打开图像的问题。我已将图像本地保存在 context.getFilesDir()/myDir/myImage.png 路径中,并且我已经设置了一个提供程序。
为了打开图像,我这样做:
File imagePath = new File(requireContext().getFilesDir(), "myDir");
File newFile = new File(imagePath, miImage.getFilename());
Uri contentUri = getUriForFile(requireContext(), requireContext().getPackageName() + ".provider", newFile);
Intent i = new Intent(Intent.ACTION_VIEW);
i.setFlags(FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION);
requireContext().grantUriPermission(requireContext().getPackageName(), contentUri, FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION);
i.setData(contentUri);
开始活动(一);
一切似乎都有效,但不幸的是,在选择图库应用程序后,我没有看到图像,而只有一个无限加载器。
有人可以帮助我吗?
谢谢。
PS 该应用程序是使用 Android 10 sdk 构建的。
解决方案
您可以使用 Glide,它允许管理图像
https://github.com/bumptech/glide
mFavDishDetails?.let {
if (it.id != 0) {
mImagePath = it.image
// Load the dish image in the ImageView.
Glide.with(this@AddUpdateDishActivity)
.load(mImagePath)
.centerCrop()
.into(mBinding.ivDishImage)
mBinding.etTitle.setText(it.title)
mBinding.etType.setText(it.type)
mBinding.etCategory.setText(it.category)
mBinding.etIngredients.setText(it.ingredients)
mBinding.etCookingTime.setText(it.cookingTime)
mBinding.etDirectionToCook.setText(it.directionToCook)
mBinding.btnAddDish.text = resources.getString(R.string.lbl_update_dish)
}
/**
* Receive the result from a previous call to
* {@link #startActivityForResult(Intent, int)}. This follows the
* related Activity API as described there in
* {@link Activity#onActivityResult(int, int, Intent)}.
*
* @param requestCode The integer request code originally supplied to
* startActivityForResult(), allowing you to identify who this
* result came from.
* @param resultCode The integer result code returned by the child activity
* through its setResult().
* @param data An Intent, which can return result data to the caller
* (various data can be attached to Intent "extras").
*/
public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == Activity.RESULT_OK) {
if (requestCode == CAMERA) {
data?.extras?.let {
val thumbnail: Bitmap =
data.extras!!.get("data") as Bitmap // Bitmap from camera
// Set Capture Image bitmap to the imageView using Glide
Glide.with(this@AddUpdateDishActivity)
.load(thumbnail)
.centerCrop()
.into(mBinding.ivDishImage)
mImagePath = saveImageToInternalStorage(thumbnail)
Log.i("ImagePath", mImagePath)
// Replace the add icon with edit icon once the image is loaded.
mBinding.ivAddDishImage.setImageDrawable(
ContextCompat.getDrawable(
this@AddUpdateDishActivity,
R.drawable.ic_vector_edit
)
)
}
} else if (requestCode == GALLERY) {
data?.let {
// Here we will get the select image URI.
val selectedPhotoUri = data.data
// Set Selected Image URI to the imageView using Glide
Glide.with(this@AddUpdateDishActivity)
.load(selectedPhotoUri)
.centerCrop()
.diskCacheStrategy(DiskCacheStrategy.ALL)
.listener(object : RequestListener<Drawable> {
override fun onLoadFailed(
@Nullable e: GlideException?,
model: Any?,
target: Target<Drawable>?,
isFirstResource: Boolean
): Boolean {
// log exception
Log.e("TAG", "Error loading image", e)
return false // important to return false so the error placeholder can be placed
}
override fun onResourceReady(
resource: Drawable,
model: Any?,
target: Target<Drawable>?,
dataSource: DataSource?,
isFirstResource: Boolean
): Boolean {
val bitmap: Bitmap = resource.toBitmap()
mImagePath = saveImageToInternalStorage(bitmap)
Log.i("ImagePath", mImagePath)
return false
}
})
.into(mBinding.ivDishImage)
// Replace the add icon with edit icon once the image is selected.
mBinding.ivAddDishImage.setImageDrawable(
ContextCompat.getDrawable(
this@AddUpdateDishActivity,
R.drawable.ic_vector_edit
)
)
}
}
} else if (resultCode == Activity.RESULT_CANCELED) {
Log.e("Cancelled", "Cancelled")
}
}
Github 仓库
https://github.com/wilson1234567891962/Complete-Android-11-Jetpack-Masterclass
推荐阅读
- c# - EFCore 过滤具有包含和值列表的属性
- c++ - 为什么使用私有动态数组时性能最差
- r - 尝试编写一个安装包的函数(如果尚未安装),然后加载它
- android - 未能连接到蓝牙设备 HC-08:“java.io.IOException:读取失败,套接字可能关闭或超时,读取 ret:-1”
- php - Ajax 调用 php curl 产生 undefined
- node.js - 检查用户是否有权限
- java - Spring Boot \ JWT:ResponseEntity类型中的方法ok(T)不适用于参数(JwtResponse)
- javascript - 安装时出现 TSC 错误消息。不知道怎么解决
- facebook - 使用 Graph API 从 Facebook 相册中获取视频
- c++ - 如何使用 C++ 从 CMD 中提取输出数据?