gpt4 book ai didi

android - 使用 Intent.ACTION_GET_CONTENT 时如何避免 "SecurityException"

转载 作者:行者123 更新时间:2023-11-30 00:41:02 26 4
gpt4 key购买 nike

在 Android 操作系统 5.11(也可能是其他操作系统)上,当使用 Intent.ACTION_GET_CONTENT 通过 Android 系统文件选择器列出文件时,

Intent openIntent = new Intent(Intent.ACTION_GET_CONTENT);
openIntent.addCategory(Intent.CATEGORY_OPENABLE);
openIntent.setType("*/*");
startActivityForResult(openIntent, ANDROID_FILE_PICKER);

在 void onActivityResult() 中它得到了 SecurityException:

“权限被拒绝:打开提供程序 com.google.android.apps.docs.storagebackend.StorageBackendContentProvider...需要 android.permission.MANAGE_DOCUMENTS”

异常的解决方法是:

Intent openIntent = new Intent(Intent.ACTION_GET_CONTENT);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
openIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
openIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
openIntent.addCategory(Intent.CATEGORY_OPENABLE);
openIntent.setType("*/*");
startActivityForResult(openIntent, ANDROID_FILE_PICKER);

并在 onActivityResult() 中执行:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
int takeFlags = data.getFlags();
takeFlags &= (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
getContentResolver().takePersistableUriPermission(uri, takeFlags);

它解决了权限问题。

但更糟糕的是,从使用 Intent.ACTION_GET_CONTENT 更改为 Intent.ACTION_OPEN_DOCUMENT 会导致 Android 的系统文件选择器菜单不显示内容提供者,如 Dropbox、Photos 等。

(如 Who to show more providers with ACTION_OPEN_DOCUMENT 中所指出)。

所以问题是它是否必须使用 Intent.ACTION_GET_CONTENT 列出 Dropbox 等,但如何避免获得 SecurityException?

最佳答案

这似乎有效。如果有人知道,一定有更好的解决方案:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
try {
this.grantUriPermission(
this.getPackageName(),
uri,
Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
);
} catch (IllegalArgumentException e) {
this.grantUriPermission(
this.getPackageName(),
uri,
Intent.FLAG_GRANT_READ_URI_PERMISSION
); // kikat api only 0x3 are
// allowed FLAG_GRANT_READ_URI_PERMISSION = 1 | FLAG_GRANT_WRITE_URI_PERMISSION = 2;
} catch (SecurityException e) {
// ignore
}

int takeFlags = data.getFlags();
takeFlags &= (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

try {
getContentResolver().takePersistableUriPermission(uri, takeFlags);
} catch (SecurityException e) {
// ignore
}
}

关于android - 使用 Intent.ACTION_GET_CONTENT 时如何避免 "SecurityException",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42584327/

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