Android 开发中,会碰到一些特殊后缀的文件需要用自家 App 打开,也就是需要 Android 应用关联特定后缀名的文件。
问题分析
应用场景比如:App 导出特定后缀名的备份文件,用户在文件浏览器中点击该文件时,需要用自家 App 打开并恢复备份数据。在这里以此为例。当然,适用场景绝不局限于此。
从文件管理器到自家 App,其实就是一个 Intent 传递过程,Intent 所携带的最关键的信息就是 data 信息, 而 data 由 mimeType 和 URI 组成。mimeType 表示文件媒体类型, URI 的结构为:
<scheme>://<host>:<port>[<path>|<pathPrefix>|<pathPattern>]
关于此部分信息可参考 data element 或者 data 匹配规则 。
需要解决的问题就变成了:应该怎样配置自家App,才能关联包含特定 URI 的 Intent。其实就等效于 Activity 如何能打开包含指定的 Intent 信息。
Android 7.0 之前,分享文件的
URI一般是通过如下示例代码得到:1
2File fileToShare = ...;
Uri fileUri = Uri.fromFile(fileToShare);这里的
Uri是file://格式的。Android 7.0 起,文件分享加入了更加安全的机制,引入了
FileProvider,获取分享文件的URI:1
2File fileToShare = ...;
Uri fileUri = FileProvider.getUriFromFile(Context, authority, fileToShare);这里的
Uri是content://格式的。
再就是要限定特殊的后缀名,除了后缀名之外都不限制,所以路径应该采用 pathPattern 来进行通配符通配。关于 pathPattern 语法:
.表示匹配任意字符;*表示匹配0到多次;.*表示匹配任意长度字符串;\是转义字符,但在 xml 中用\\来表示。比如用\\.表示小数点.;
解决方案
比如,我们的 App 中的 com.example.ActivityA 要支持打开后缀名为 .myext 的文件,其 mimeType 为 text/plain。
通过以上分析,我们需要在 AndroidManifest.xml 中配置:
1 | <activity |
需要注意的是,在接收读取 Uri 为 file:// 形式的文件数据之前,需要获取 READ_EXTERNAL_STORAGE 权限。 content:// 形式的文件数据则不需要该权限。
参考
Intents and Intent Filters
Android intent filter: associate app with file extension
dat element