自研Android文件管理器无法响应ACTION_GET_CONTENT意图怎么办?
问题原因
- Android Studio报错
Cannot resolve symbol 'image/*'是因为你用错了属性,配置数据类型的正确属性是android:mimeType,而非android:type,写错属性自然无法识别对应值。 - K9等第三方应用发起
ACTION_GET_CONTENT请求时默认会携带具体的mimeType参数,部分场景还会使用content://格式的URI,你原有配置中单独加了data android:scheme="file"的过滤规则,只会匹配file://开头的URI,导致绝大多数带content scheme的请求无法匹配到你的应用。 - 你写了多个重复的
ACTION_GET_CONTENT意图过滤,逻辑互相冲突,反而会降低匹配成功率。
解决步骤
- 清理
FileChooser活动中多余的ACTION_GET_CONTENT意图过滤,仅保留以下配置即可适配所有通用文件选择场景:
<intent-filter> <action android:name="android.intent.action.GET_CONTENT" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.OPENABLE" /> <data android:mimeType="*/*" /> </intent-filter>
不要额外加scheme="file"的限制,该配置会自动匹配所有scheme的URI,同时适配任意mimeType的请求。
- 如果需要单独支持仅选择图片的场景,额外新增一个意图过滤即可,用正确的
mimeType属性不会再报符号错误:
<intent-filter> <action android:name="android.intent.action.GET_CONTENT" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.OPENABLE" /> <data android:mimeType="image/*" /> </intent-filter>
- 补充活动返回逻辑:用户选完文件后,返回结果时需要给URI授予临时访问权限,否则调用方拿到URI也无法读取文件内容,示例代码如下:
// 选完文件后构造返回结果 Intent result = new Intent(); result.setDataAndType(returnUri, mimeType); // 给调用方授予读取权限 result.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); setResult(RESULT_OK, result); finish();
内容的提问来源于stack exchange,提问作者Luis A. Florit
相关产品推荐
相关产品推荐

