我正在使用Storage Access Framework来获取SD卡上的写访问权限(API> = 21)。

它在大多数设备上都可以正常工作,但是像Galaxy S7(Edge,API 23)这样的设备在调用takePersistableUriPermission()时会抛出SecurityException。

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


码:

//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设备上都出现此异常。我已经在2台设备上成功测试了代码,但是此设备引发了SecurityException。

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

intent.addFlags(
Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION |
Intent.FLAG_GRANT_READ_URI_PERMISSION |
Intent.FLAG_GRANT_WRITE_URI_PERMISSION);


任何帮助表示赞赏。

最佳答案

我尝试在grantUriPermission之前添加takePersistableUriPermission,这对我来说是唯一可以避免系统SecurityException引发错误的方法:

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());
}
}

08-05 09:35