4

背景

在现代桌面操作系统上,能够处理文件是一个众所周知的功能,允许用户从文件管理器和其他应用程序中打开它们,作为“文件关联”配置。

问题

到目前为止,对于用户和开发人员来说,在 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 时)。

我发现了什么

我为此找到的唯一东西是在文档中:

可悲的是,我找不到任何例子,我什至不知道这是否是现在处理文件的官方方式。

问题

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

1 回答 1

-1

好的,经过我自己的一些研究,以下是我对我的问题的回答:

  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 for pre-Android-12 的语法糖,here

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

似乎不是这样。

于 2021-10-02T20:30:06.940 回答