从图库中选择图像会出现错误 Android N

2024-02-28

我在从 Android N 中的意图中检索 Uri 时遇到问题。 据我所知,在 Android 24 及更高版本上获取您需要的外部 UriFileProvider声明于Manifest。这一切都完成了,它可以与相机一起使用,但是当我尝试从图库中获取图像时,出现错误onActivityResult data.getData();

这些是我的代码的一些示例:

public void getPictureFromGallery(){
    picUriCar = null;
    try {
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType("image/*");
        startActivityForResult(intent, PIC_SELECT);
    } catch (ActivityNotFoundException e) {
        Toast.makeText(MainActivity.this, getResources().getString(R.string.text_error_no_gallery_app),
                Toast.LENGTH_SHORT).show();
    }
}

And onActivityResult:

else if(requestCode == PIC_SELECT){
     picUriCar = data.getData();
     if (picUriCar != null){
         performCrop();
     }
}

据我所知data.getData()返回一个 Uri,这在 Marshmallow 上工作正常,但在 Nougat 手机上我收到此错误:

java.lang.RuntimeException:传递结果失败 ResultInfo{who=null, request=5, result=-1, data=Intent { dat=content://com.android.externalstorage.documents/document/4996-1EFF:DCIM/100ANDRO/DSC_0004.JPG flg=0x1 }} 到活动 {com.company.example/com.company.example.MainActivity}: java.lang.SecurityException: Uid 10246 没有 uri 的权限 0 @ 内容://com.android.externalstorage.documents/document/4996-1EFF%3ADCIM%2F100ANDRO%2FDSC_0004.JPG 在 android.app.ActivityThread.deliverResults(ActivityThread.java:4267) 在 android.app.ActivityThread.handleSendResult(ActivityThread.java:4310) 在 android.app.ActivityThread.-wrap20(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1628) 在 android.os.Handler.dispatchMessage(Handler.java:110) 在 android.os.Looper.loop(Looper.java:203) 在 android.app.ActivityThread.main(ActivityThread.java:6361) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924) 引起原因:java.lang.SecurityException:Uid 10246没有uri 0 @的权限 内容://com.android.externalstorage.documents/document/4996-1EFF%3ADCIM%2F100ANDRO%2FDSC_0004.JPG 在 android.os.Parcel.readException(Parcel.java:1683) 在 android.os.Parcel.readException(Parcel.java:1636) 在 android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:3213) 在 android.app.Instrumentation.execStartActivity(Instrumentation.java:1525) 在 android.app.Activity.startActivityForResult(Activity.java:4235) 在 android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:767) 在 android.app.Activity.startActivityForResult(Activity.java:4194) 在 android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:754) 在 com.company.example.MainActivity.performCrop(MainActivity.java:1654) 在 com.company.example.MainActivity.onActivityResult(MainActivity.java:1534) 在 android.app.Activity.dispatchActivityResult(Activity.java:6928) 在 android.app.ActivityThread.deliverResults(ActivityThread.java:4263) 在 android.app.ActivityThread.handleSendResult(ActivityThread.java:4310) 在 android.app.ActivityThread.-wrap20(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1628) 在 android.os.Handler.dispatchMessage(Handler.java:110) 在 android.os.Looper.loop(Looper.java:203) 在 android.app.ActivityThread.main(ActivityThread.java:6361) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)

我的问题是: 我该如何通过data.getData()uri 到 picUriCar 没有任何错误?


使用此代码创建新的意图来选择图像:

Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        intent.setType(image/*);
        startActivityForResult(Intent.createChooser(intent, ""), Constants.SELECT_PICTURE);

使用此代码onActivityResult:

if (resultCode == Activity.RESULT_OK) {
        if (requestCode == Constants.SELECT_PICTURE) {
            Uri selectedImageUri = data.getData();
            try {
                if (isNewGooglePhotosUri(selectedImageUri)) {
                    resultFile = getPhotoFile(selectedImageUri);
                } else {
                    resultFile = getFilePathForGallery(selectedImageUri);
                }
                if (resultFile == null) {
                    //error
                    return;
                }
            } catch (Exception e) {
                e.printStackTrace();
                //error
                return;
            }
        }
    }
}

另外,这是我在代码中使用的一些有用的函数:

private File getFilePathForGallery(Uri contentUri) {
        String path = null;
        String[] proj = {MediaStore.Images.Media.DATA};
        Cursor cursor = getContentResolver().query(contentUri, proj, null, null, null);
        if (cursor.moveToFirst()) {
            int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            path = cursor.getString(column_index);
        }
        cursor.close();
        return new File(path);
    }

  public static boolean isNewGooglePhotosUri(Uri uri) {
        return "com.google.android.apps.photos.contentprovider".equals(uri.getAuthority());
    }

private File getPhotoFile(Uri selectedImageUri) {
        try {
            InputStream is = mActivityInstance.getContentResolver().openInputStream(selectedImageUri);
            if (is != null) {
                Bitmap pictureBitmap = BitmapFactory.decodeStream(is);
                ByteArrayOutputStream bytes = new ByteArrayOutputStream();
                pictureBitmap.compress(Bitmap.CompressFormat.JPEG, 80, bytes);
                File output = new File(FileManager.getImageCacheDir(mActivityInstance), System.currentTimeMillis() + ".jpg");
                output.createNewFile();
                FileOutputStream fo = new FileOutputStream(output);
                fo.write(bytes.toByteArray());
                fo.close();
                return output;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

FileManager 类的函数:

private static File getCacheDir(Context context) {
        File cacheDir = context.getExternalFilesDir(null);
        if (cacheDir != null) {
            if (!cacheDir.exists())
                cacheDir.mkdirs();
        } else {
            cacheDir = context.getCacheDir();
        }
        return cacheDir;
    }

     public static File getImageCacheDir(Context context) {
        File imageCacheDir = new File(getCacheDir(context), "cache_folder");
        if (!imageCacheDir.exists())
            imageCacheDir.mkdirs();
        return imageCacheDir;
    }

您还需要在 xml 文件夹中创建新的 xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path
        name="external_files"
        path="." />
</paths>

然后添加新的provider清单文件:

 <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/your_xml_file" />
        </provider>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从图库中选择图像会出现错误 Android N 的相关文章

  • 什么时候可以在 Java 中使用 Thead.stop() ?

    Thread stop 的 Java 文档听起来好像如果您调用 Thread stop 世界就会终结 已弃用 这种方法本质上是不安全的 停止线程 Thread stop 导致它解锁所有已锁定的监视器 作为未经检查的 ThreadDeath
  • 使用 JUnit 时,有没有办法验证测试方法中是否调用了 try/catch 指令的 Catch 部分?

    例如 如果我想测试以下课程 public class SomeClass public void someMethod try Some code where comething could go wrong catch Exception
  • 如何在Android Compose中使用otf类型字体文件?

    我正在学习使用 Android Jetpack Compose 现在我有一个正则 otf字体文件在资产 字体 我想在文本中使用它 java lang RuntimeException Font asset not found commonu
  • 是否可以通过编程方式查找 logback 日志文件?

    自动附加日志文件以支持电子邮件会很有用 我可以以编程方式设置路径 如以编程方式设置 Logback Appender 路径 https stackoverflow com questions 3803184 setting logback
  • 使用 Guice 优化注册表

    你好 今天思考了一种优化 有一些疑问 语境 我正在使用 Guice 2 进行 Java 开发 在我的网络应用程序中 我有一个转换器注册表 可以即时转换为某种类型 转换器描述如下 public class StringToBoolean im
  • Java Swing For mac 中的 DJ Native Swing 浏览器

    我有一个用 Swing 制作的 Java 应用程序 并且使用了一个 DJ Native Swing 浏览器 当我尝试在 OS X 上使用它时 它抛出了一个NoClassDefFoundError尽管我添加了 swt jar 但始终如此 有人
  • GWT 2.3 开发模式 - 托管模式 JSP 编译似乎不使用 java 1.5 兼容性

    无法编译 JSP 类 生成的 servlet 错误 DefaultMessage 上次更新 0 日期 中 0 时间 HH mm ss z 语法 错误 注释仅在源级别为 1 5 时可用 在尝试以开发模式在 Web 浏览器中打开我的 gwt 模
  • 使用 Mockito 模拟某些方法,但不模拟其他方法

    有没有办法使用 Mockito 模拟类中的某些方法 而不模拟其他方法 例如 在这个 诚然是人为的 Stock我想嘲笑的班级getPrice and getQuantity 返回值 如下面的测试片段所示 但我想要getValue 执行乘法 如
  • QuerySyntaxException:无法找到类

    我正在使用 hql 生成 JunctionManagementListDto 类的实际 Java 对象 但我最终在控制台上出现以下异常 org hibernate hql internal ast QuerySyntaxException
  • 返回 Java 8 中的通用函数接口

    我想写一种函数工厂 它应该是一个函数 以不同的策略作为参数调用一次 它应该返回一个函数 该函数根据参数选择其中一种策略 该参数将由谓词实现 嗯 最好看看condition3为了更好的理解 问题是 它没有编译 我认为因为编译器无法弄清楚函数式
  • “无法实例化活动”错误

    我的一个 Android 应用程序拥有大约 100 000 个用户 每周大约 10 次 我会通过 Google 的市场工具向我报告以下异常情况 java lang RuntimeException Unable to instantiate
  • 在 Android 布局 xml 文件中使用字符串格式参数 [重复]

    这个问题在这里已经有答案了 我在 String xml 文件中定义了一个使用格式参数的字符串 即
  • 更改Android菜单的背景颜色[重复]

    这个问题在这里已经有答案了 我正在尝试将标准浅灰色更改为浅绿色 似乎没有一个简单的方法可以做到这一点 例如 通过 Android 主题 但我找到了一个解决方法 如本页所述 http tinyurl com 342dgn3 http tiny
  • Java Swing:需要一个高质量的带有复选框的开发 JTree

    我一直在寻找一个 Tree 实现 其中包含复选框 其中 当您选择一个节点时 树中的所有后继节点都会被自动选择 当您取消选择一个节点时 树中其所有后继节点都会自动取消选择 当已经选择了父节点 并且从其后继之一中删除了选择时 节点颜色将发生变化
  • Resteasy 可以查看 JAX-RS 方法的参数类型吗?

    我们使用 Resteasy 3 0 9 作为 JAX RS Web 服务 最近切换到 3 0 19 我们开始看到很多RESTEASY002142 Multiple resource methods match request警告 例如 我们
  • 通过powershell运行ADB命令

    所以我尝试通过 powershell 脚本运行一些 ADB 命令 这是我正在尝试做的一个简单示例 adb shell echo in adb shell su root echo you are now root ls cd data da
  • 异步更新后更新Android Listview

    我正在将 HTTP 调用从同步调用转换为异步调用 由于连接在后台运行 因此当我最初设置列表适配器时 数据不存在 如何在 HTTP 调用后更新列表适配器 我尝试了一些方法 例如在数据发送回之前不设置适配器并再次设置适配器 但没有任何效果 这是
  • 配置“DataSource”以使用 SSL/TLS 加密连接到 Digital Ocean 上的托管 Postgres 服务器

    我正在尝试托管数据库服务 https www digitalocean com products managed databases on 数字海洋网 https en wikipedia org wiki DigitalOcean 创建了
  • 在浏览器刷新中刷新检票面板

    我正在开发一个付费角色系统 一旦用户刷新浏览器 我就需要刷新该页面中可用的统计信息 统计信息应该从数据库中获取并显示 但现在它不能正常工作 因为在页面刷新中 java代码不会被调用 而是使用以前的数据加载缓存的页面 我尝试添加以下代码来修复
  • Java EE 目录结构

    我对以下教程有疑问 http www mkyong com jsf2 jsf 2 internationalization example http www mkyong com jsf2 jsf 2 internationalizatio

随机推荐