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