API 31 上是否有官方方法来提供文件关联,可能使用 pathSuffix/pathAdvancedPattern?

2024-05-09

背景

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

问题

到目前为止,对于用户和开发人员来说,在 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 文件,可能是这样的(不确定它是否是最小/最好的文件):

<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#pathSuffix
  • https://developer.android.com/reference/android/R.attr#pathAdvancedPattern https://developer.android.com/reference/android/R.attr#pathAdvancedPattern

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

问题

  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 时才会出现这种情况?

可悲的是没有。我要求它成为 Android-12 之前版本从 pathSuffix 到 pathPattern 的语法糖,here https://issuetracker.google.com/issues/201790854.

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

看来并非如此。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

API 31 上是否有官方方法来提供文件关联,可能使用 pathSuffix/pathAdvancedPattern? 的相关文章

随机推荐