问题描述
我正在开发旧的 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);
startActivity(i);
似乎一切正常,但不幸的是,在选择图库应用程序后,我没有看到图像,而只有一个无限加载器。
有人可以帮助我吗?
谢谢。
附言该应用使用 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,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