Android - 使用 action_view 意图打开本地图像 uri

如何解决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);

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?