0%

Android 应用关联特定后缀名的文件

Android 开发中,会碰到一些特殊后缀的文件需要用自家 App 打开,也就是需要 Android 应用关联特定后缀名的文件。

问题分析

应用场景比如:App 导出特定后缀名的备份文件,用户在文件浏览器中点击该文件时,需要用自家 App 打开并恢复备份数据。在这里以此为例。当然,适用场景绝不局限于此。

从文件管理器到自家 App,其实就是一个 Intent 传递过程,Intent 所携带的最关键的信息就是 data 信息, 而 datamimeTypeURI 组成。mimeType 表示文件媒体类型, URI 的结构为:

<scheme>://<host>:<port>[<path>|<pathPrefix>|<pathPattern>]

关于此部分信息可参考 data element 或者 data 匹配规则

需要解决的问题就变成了:应该怎样配置自家App,才能关联包含特定 URIIntent。其实就等效于 Activity 如何能打开包含指定的 Intent 信息。

  • Android 7.0 之前,分享文件的 URI 一般是通过如下示例代码得到:

    1
    2
    File fileToShare = ...;
    Uri fileUri = Uri.fromFile(fileToShare);

    这里的 Urifile:// 格式的。

  • Android 7.0 起,文件分享加入了更加安全的机制,引入了 FileProvider,获取分享文件的 URI

    1
    2
    File fileToShare = ...;
    Uri fileUri = FileProvider.getUriFromFile(Context, authority, fileToShare);

    这里的 Uricontent:// 格式的。

再就是要限定特殊的后缀名,除了后缀名之外都不限制,所以路径应该采用 pathPattern 来进行通配符通配。关于 pathPattern 语法:

  • . 表示匹配任意字符;
  • * 表示匹配0到多次;
  • .* 表示匹配任意长度字符串;
  • \ 是转义字符,但在 xml 中用 \\ 来表示。比如用 \\. 表示小数点 .

解决方案

比如,我们的 App 中的 com.example.ActivityA 要支持打开后缀名为 .myext 的文件,其 mimeTypetext/plain

通过以上分析,我们需要在 AndroidManifest.xml 中配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<activity
android:name="com.example.ActivityA">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data
android:scheme="content"
android:host="*"
android:pathPattern="/.*\\.myext"
android:mimeType="text/plain"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data
android:scheme="file"
android:host="*"
android:pathPattern="/.*\\.myext"
android:mimeType="text/plain" />
</intent-filter>
</activity>

需要注意的是,在接收读取 Urifile:// 形式的文件数据之前,需要获取 READ_EXTERNAL_STORAGE 权限。 content:// 形式的文件数据则不需要该权限。

参考

Intents and Intent Filters
Android intent filter: associate app with file extension
dat element