背景
在现代桌面操作系统上,能够处理文件是一个众所周知的功能,允许用户从文件管理器和其他应用程序中打开它们,作为“文件关联”配置。
问题
到目前为止,对于用户和开发人员来说,在 Android 上设置文件类型的关联并不是一件方便的事情。
在 Android API 30(Android 11,AKA Android R)之前,您必须使用一些奇怪的解决方法,尤其是在文件不是已知文件的情况下。
“xyz”的示例:
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.OPENABLE" />
<data android:scheme="content" />
<data android:scheme="file" />
<data android:host="*" />
<data android:mimeType="*/*" />
<data android:pathPattern=".*\\.xyz" />
<data android:pathPattern=".*\\..*\\.xyz" />
<data android:pathPattern=".*\\..*\\..*\\.xyz" />
<data android:pathPattern=".*\\..*\\..*\\..*\\.xyz" />
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.xyz" />
...
</intent-filter>
如果它是已知的,例如 ZIP 文件,可能是这样的(不确定它是否是最小/最好的):
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.OPENABLE" />
<data android:scheme="package" />
<data android:scheme="content" />
<data android:scheme="file" />
<data android:mimeType="application/x-zip" />
<data android:mimeType="application/x-zip-compressed" />
<data android:mimeType="application/zip" />
</intent-filter>
事实上,即使它是已知的,您仍然应该考虑同时使用这两种方式,因为某些应用程序只处理第一种方式。
但是在 Android API 31 (Android 12, AKA Android S) 上,它似乎发生了变化,我们可能可以在清单中写得更少(遗憾的是,可能只有当最小 API 为 31 时)。
我发现了什么
我为此找到的唯一东西是在文档中:
- https://developer.android.com/reference/android/R.attr#pathSuffix
- https://developer.android.com/reference/android/R.attr#pathAdvancedPattern
可悲的是,我找不到任何例子,我什至不知道这是否是现在处理文件的官方方式。
问题
- 它现在真的是在 Android 上处理文件的真正、有效、官方的方式吗?
- 我现在应该如何使用它?我还需要设置 mimeType 吗?这适用于任何类型的文件,无论是否已知?
- 是否可以这样设置,并停止使用我提到的方式?还是仅当我将 minSdk 设置为 31 时?
- 它会以任何方式影响用户的体验吗?