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 时才可能)。

我发现了什么

我在文档中找到的唯一内容是:

遗憾的是,我找不到示例,我什至不知道现在是否是处理文件的官方方式。

问题

  1. 它现在真的是 Android 上处理文件的真实、有效、正式的方式吗?
  2. 现在应该如何使用?我还需要设置 mimeType 吗?这适用于任何类型的文件,无论已知与否?
  3. 是否可以这样设置,并停止使用我提到的方式?或者这仅当我将 minSdk 设置为 31 时?
  4. 它是否会以任何方式影响用户体验?

好的,经过我自己的一番研究,这里是我对我的问题的回答:

  1. 它现在真的是 Android 上处理文件的真实、有效、正式的方式吗?

好像是。

  1. 现在应该如何使用?我还需要设置 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" />)。

  1. 是否可以这样设置,并停止使用我提到的方式?或者这只是当我将 minSdk 设置为 31 时?

遗憾的是没有。我已经要求它成为从 pathSuffix 到 pathPattern 的语法糖,用于 pre-Android-12, here.

  1. 它是否会以任何方式影响用户体验?

好像不是。