android - Android Oreo:使用 Intent.createChooser 包装时,来自 ACTION_GET_CONTENT 的 URI 未授予 FLAG_GRANT_READ_URI_PERMISSION
问题描述
使用 Intent.createChooser 包装的 Intent ACTION_GET_CONTENT 时出现以下异常。当我不使用 Intent.createChooser 包装 Intent 时,我没有收到此异常。
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { dat=content://com.android.providers.downloads.documents/document/523 flg=0x1 (has extras) }} to activity {com.mycompany.app/com.mycompany.app.activity.MessageCompose}: java.lang.SecurityException: Permission Denial: opening provider com.android.providers.downloads.DownloadStorageProvider from ProcessRecord{..} (pid=20538, uid=10127) requires that you obtain access using ACTION_OPEN_DOCUMENT or related APIs
有问题的代码:-
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType(type);
i = Intent.createChooser(i, "Select a file");
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET | Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivityForResult(i, ACTIVITY_REQUEST_PICK_ATTACHMENT);
当我删除该行时代码有效
i = Intent.createChooser(i, "Select a file");
当我检查 onActivityResult
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
...
uri = data.getData();
int permissionGrant = getApplicationContext().checkCallingOrSelfUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
// Returns PERMISSION_GRANTED without createChooser
// Returns PERMISSION_DENIED with createChooser
清单文件:-
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.mycompany.app.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/providers_paths"/>
</provider>
使用选择器时如何解决此问题。
解决方案
推荐阅读
- php - 如何在 PHP 中连接 SQL 查询字符串
- python - 即使在递归搜索中文件的字符串不止一个,也只写入一次文件路径
- javascript - Angular:输入绑定未更新
- jquery-select2 - 从 Select2 搜索结果中排除现有标签
- c++ - 发布序列代码片段,给出随机行为
- javascript - 用于创建格式化 XLSX 电子表格的 JS 库
- python - C-API:PySys_SetObject 引用计数
- javascript - 我可以选择类型=“文件”吗?
- html - 如何从电子邮件签名中删除文本下划线?
- java - Gradle 失败:无法从“13.0.1”确定 java 版本