gpt4 book ai didi

android - 在 URI 上使用 "grantUriPermission"时出现 java.lang.SecurityException

转载 作者:行者123 更新时间:2023-11-29 02:33:19 34 4
gpt4 key购买 nike

我的应用程序收到了多个崩溃报告,其中包含 java.lang.SecurityException。当应用程序尝试获得对用户从其图像中选择的图像 URI 的持久权限时,会发生这种情况。选择图像的方法是通过一个 Intent :

public static Intent openGalleryToSelectImages(Activity a)
{
Intent intent = new Intent();
// Set action
if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
}
else {
intent.setAction(Intent.ACTION_GET_CONTENT);
}
// Set MIME type and allow multiple selection
intent.setType("image/*");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
}
a.startActivityForResult(Intent.createChooser(intent,"Select Picture"), Communication.REQUEST_SELECT_IMAGES_FROM_GALLERY);

return intent;
}

然后我对接收到的 URI 数组执行一些操作。当我尝试为每个 URI 获取持久读取权限时发生崩溃:

activity.grantUriPermission(activity.getPackageName(), uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
activity.getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);

但我无法弄清楚那有什么问题。对此上瘾,该应用程序在多个智能手机上运行良好,因此它似乎绑定(bind)到特定供应商。

编辑:我无法对导致崩溃的设备进行深入分析。在我的开发设备上,图像的 URI 类似于:

content://com.android.providers.media.documents/document/image%3A796

最佳答案

您不能向自己授予权限。

您要求另一个应用程序(例如 Gallery)为您提供资源的 Uri,如果该应用程序编写得当,它会在返回时授予您的应用程序读取该 Uri 的权限。

遗憾的是,某些图库应用(包括知名 Android 手机制造商的应用)不会授予您任何东西。

这就是我们最终不得不请求 READ_EXTERNAL_STORAGE 权限的原因。这也意味着您需要在适当的时候请求 Android 6+ 上的运行时权限。

我最终捕获了 SecurityException 并在那一刻请求运行时许可 - 当我绝对需要它时。

教训是惨痛的:当您在 onRequestPermissionsResult 中返回肯定结果时,您的 Activity 处于停止状态。如果您立即离开(例如通过在回调中调用 startActivity),您将无法保存状态并且会丢失对成员变量的任何更改。现在将您需要的内容放入成员变量中,但将 startActivity 推迟到 onResume

关于android - 在 URI 上使用 "grantUriPermission"时出现 java.lang.SecurityException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48484937/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com