在Android 10中,Picasso无需任何许可即可真正显示带有图像Uri的图像,但openInputStream需要许可

问题描述

在 Android 应用程序中,
Android 10 关于范围存储

Picasso 能够用图像的 Uri 真实地显示图像
并且即使Android的版本是10也不需要任何许可
但是当我尝试使用 openInputStream 时,会出现一个错误,指示未授予权限

我想知道 Picasso 如何在没有任何许可的情况下显示图像但打开流需要许可

代码如下:

        Picasso.with(mContext).load(mUri).resize(200,200).into(mImageButton);

        InputStream mInputStream;
        try
        {
            mInputStream = mContext.getContentResolver().openInputStream(mUri);
        } catch (Exception e) {
            e.printstacktrace();
        }

错误如下:

java.lang.SecurityException: Permission Denial: reading com.miui.gallery.provider.galleryOpenProvider uri content://com.miui.gallery.open/raw/storage/emulated/0/Download/MellatMobileBank_Android.apk/icons/jar-gray.png from pid=2300,uid=10251 requires the provider be exported,or grantUriPermission()

那么,我如何在没有授权的情况下获得图像流?

编辑:
我在 onActivityResult 中做了一个测试,可以从中检索图像结果以查看 openInputStream 是否在那里工作
代码如下:

@Override
    public void onActivityResult(int requestCode,int resultCode,Intent data) {
    if (requestCode == Constants.Uri_M) {
                if (resultCode == RESULT_OK) {
                    Uri_M = data.getData();
                    Uri_M_String = Uri_M.toString();

                    mInputStream = getApplicationContext().getContentResolver().openInputStream(Uri_M);

上面的代码工作正常,而下面的代码有相同的先前错误(权限问题):

@Override
    public void onActivityResult(int requestCode,Intent data) {
    if (requestCode == Constants.Uri_M) {
                if (resultCode == RESULT_OK) {
                    Uri_M = data.getData();
                    Uri_M_String = Uri_M.toString();

                
                    Uri b = Uri.parse(Uri.decode(Uri_M_String));
                    mInputStream = getApplicationContext().getContentResolver().openInputStream(b);

关键是 Picasso 使用 Uri_M_String 工作正常,但对于 openInputStream,我首先将 Uri_M_String 转换为 Uri_M,如下所示:

Uri Uri_M = Uri.parse(Uri.decode(Uri_M_String));

然后:

mInputStream = getApplicationContext().getContentResolver().openInputStream(Uri_M);

导致错误
所以问题是我正在做的从 Uri 字符串中获取 Uri 的转换

但是我怎样才能从它的 Uri 字符串中得到真正的 Uri?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)