首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >takePersistableUriPermission()上的java.lang.SecurityException (SAF)

takePersistableUriPermission()上的java.lang.SecurityException (SAF)
EN

Stack Overflow用户
提问于 2016-06-23 21:57:16
回答 2查看 2.2K关注 0票数 3

我正在使用存储访问框架来获得对SD卡的写访问权限(API >= 21)。

它在大多数设备上都工作得很好,但像Galaxy S7 (Edge,API23)这样的设备在调用takePersistableUriPermission()时会抛出SecurityException。

代码语言:javascript
复制
Caused by: java.lang.SecurityException: No persistable permission grants found for UID 10150 and Uri 0 @ content://com.android.externalstorage.documents/tree/70CD-6B92

代码:

代码语言:javascript
复制
//call the SAF
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
                        startActivityForResult(intent, Config.REQUEST_SAF);

//Persist permissions
int flags = resultData.getFlags();
flags &= (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

this.getContentResolver().takePersistableUriPermission(treeUri, flags); //throws exception

并不是所有的S7设备都会出现这种异常。我已经在两台设备上成功地测试了代码,但这一台抛出了SecurityException。

我可以在SAF的呼叫中添加一些标志吗?

代码语言:javascript
复制
intent.addFlags(
Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION |
Intent.FLAG_GRANT_READ_URI_PERMISSION |
Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

任何帮助都是非常感谢的。

EN

回答 2

Stack Overflow用户

发布于 2018-03-27 16:36:25

我尝试在takePersistableUriPermission之前添加grantUriPermission,这是唯一能避免系统SecurityException抛出的错误的方法

代码语言:javascript
复制
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
try {
    getContext().grantUriPermission(getContext().getPackageName(), uri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
} catch (IllegalArgumentException e) {
    // on Kitkat api only 0x3 is allowed (FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION)
    getContext().grantUriPermission(getContext().getPackageName(), uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
} catch (SecurityException e) {
    Log.e("", e.toString());
}

try {
    int takeFlags = intent.getFlags();
    takeFlags &= (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
    getContext().getContentResolver().takePersistableUriPermission(uri, takeFlags);
} catch (SecurityException e) {
    Log.e("", e.toString());
}
}
票数 3
EN

Stack Overflow用户

发布于 2016-06-24 00:53:09

尝试添加此flag

代码语言:javascript
复制
intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37993762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档