API 31 是否有提供文件关联的官方方式,也许使用 pathSuffix/pathAdvancedPattern?
Is there an official way on API 31 to offer a file-association, maybe using pathSuffix/pathAdvancedPattern?
背景
现代桌面操作系统的一个众所周知的功能是能够处理文件,允许用户从文件管理器和其他应用程序打开它们,作为“文件关联”配置。
问题
到目前为止,在 Android 上,对于用户和开发人员来说,设置文件类型的关联并不是一件方便的事情。
最多 Android API 30(Android 11,又名 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 文件,可能是这样的(不确定是不是 minimal/best 文件):
<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 时?
- 它是否会以任何方式影响用户体验?
好的,经过我自己的一番研究,这里是我对我的问题的回答:
- 它现在真的是 Android 上处理文件的真实、有效、正式的方式吗?
好像是。
- 现在应该如何使用?我还需要设置 mimeType 吗?这是否适用于任何类型的文件,无论已知与否?
似乎可以只在第一部分使用它:
<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:pathSuffix=".xyz" />
...
</intent-filter>
第二部分保持不变,因为它用于特殊情况。
但是,出于某种原因,我未能使用 pathAdvancedPattern
的替代方法(尝试使用 <data android:pathAdvancedPattern=".*\.xyz" />
)。
- 是否可以这样设置,并停止使用我提到的方式?或者这只是当我将 minSdk 设置为 31 时?
遗憾的是没有。我已经要求它成为从 pathSuffix 到 pathPattern 的语法糖,用于 pre-Android-12, here.
- 它是否会以任何方式影响用户体验?
好像不是。
背景
现代桌面操作系统的一个众所周知的功能是能够处理文件,允许用户从文件管理器和其他应用程序打开它们,作为“文件关联”配置。
问题
到目前为止,在 Android 上,对于用户和开发人员来说,设置文件类型的关联并不是一件方便的事情。
最多 Android API 30(Android 11,又名 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 文件,可能是这样的(不确定是不是 minimal/best 文件):
<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 时?
- 它是否会以任何方式影响用户体验?
好的,经过我自己的一番研究,这里是我对我的问题的回答:
- 它现在真的是 Android 上处理文件的真实、有效、正式的方式吗?
好像是。
- 现在应该如何使用?我还需要设置 mimeType 吗?这是否适用于任何类型的文件,无论已知与否?
似乎可以只在第一部分使用它:
<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:pathSuffix=".xyz" />
...
</intent-filter>
第二部分保持不变,因为它用于特殊情况。
但是,出于某种原因,我未能使用 pathAdvancedPattern
的替代方法(尝试使用 <data android:pathAdvancedPattern=".*\.xyz" />
)。
- 是否可以这样设置,并停止使用我提到的方式?或者这只是当我将 minSdk 设置为 31 时?
遗憾的是没有。我已经要求它成为从 pathSuffix 到 pathPattern 的语法糖,用于 pre-Android-12, here.
- 它是否会以任何方式影响用户体验?
好像不是。