首页 > 解决方案 > 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 构建的。

标签: javaandroidimageandroid-intentactionview

解决方案


您可以使用 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


推荐阅读