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? 的相关文章

  • Android Studio 3.0 Canary 9 - 无法解析包

    我在 Android Studio 3 0 Canary 9 中遇到几个错误 这些错误是 无法解析 android 软件包 下面列出了一些错误 我刚刚安装了 SDK 的所有额外软件包 但仍然收到 gradle 构建错误 Error 82 1
  • android中向sqlite中插入大量数据

    目前 我必须一次向我的 Android 中插入超过 100 亿条数据 然而 内存不足的问题会使程序崩溃 sqlite 插入测试非常简单 只需使用 for 循环生成 sql 插入命令并通过 开始 和 提交 进行包装 private Array
  • 在 ViewPager Fragments 中使用 Master/Detail 模板(下载链接)

    工作代码 https github com lukeallison ViewPagerMasterDetail https github com lukeallison ViewPagerMasterDetail Android 主 详细流
  • SearchView过滤ListView

    我已经实现了搜索视图来过滤我的列表视图项目 当我输入任何文本时 它会过滤列表 但当我退出搜索视图时 它不会返回原始列表项 public class PlacesListAdapter extends ArrayAdapter
  • 无法获取log.d或输出Robolectrict + gradle

    有没有人能够将 System out 或 Log d 跟踪从 robolectric 测试输出到 gradle 控制台 我在用Robolectric Gradle 测试插件 https github com robolectric robo
  • 如何在android中获取Camera2 API的当前曝光

    In android hardware Camera旧的 我使用下面的代码获取当前曝光并获取它Camera Camera Parameters param mCamera getParameters currentExposure para
  • 是否可以将数组或对象添加到 Android 上的 SharedPreferences

    我有一个ArrayList具有名称和图标指针的对象 我想将其保存在SharedPreferences 我能怎么做 注意 我不想使用数据库 无论 API 级别如何 请检查SharedPreferences 中的字符串数组和对象数组 http
  • Android 中 Kotlin 协程的正确使用方式

    我正在尝试使用异步更新适配器内的列表 我可以看到有太多的样板 这是使用 Kotlin 协程的正确方法吗 这个可以进一步优化吗 fun loadListOfMediaInAsync async CommonPool try Long runn
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • 获取当前 android.intent.category.LAUNCHER 活动的实例

    我创建了一个库项目 并在多个应用程序之间共享 我实现了一个简单的会话过期功能 该功能将在一段时间后将用户踢回到登录屏幕 登录屏幕活动是我的主要活动 因此在清单中它看起来像这样
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 如何使用 IF 检查 TextView 可见性

    我有一个 onCheckedChangeListener 来根据选择的单选按钮显示文本视图 我有 1 个疑问和 1 个难题 想知道是否有人可以帮助我 问题 您能否将单选组默认检查值设置为 否 单选按钮 以便一开始就不会检查任何内容 问题 如
  • Ubuntu 16.04 - Genymotion:找不到 /dev/hw_random

    I install Genymotion on the Ubuntu 16 04 64Bit I created a virtual emulator for Android 6 0 then I run this emulator but
  • 在 android DatePickerDialog 中将语言设置为法语

    有什么办法可以让日期显示在DatePickerDialog用法语 我已经搜索过这个但没有找到结果 这是我的代码 Calendar c Calendar getInstance picker new DatePickerDialog Paym
  • 在activity_main.xml中注释

    我是安卓新手 据我所知 XML 中的注释与 HTML 中的注释相同 使用 形式 我想在 Android 项目的 Activity main xml 配置文件中写一些注释 但它给了我错误 值得注意的是 我使用的是 Eclipse 但目前 我直
  • 如何确定对手机号码的呼叫是本地呼叫还是 STD 或 ISD

    我正在为 Android 开发某种应用程序 但不知道如何获取被叫号码是本地或 STD 的号码的数据 即手机号码检查器等应用程序从哪里获取数据 注意 我说的是手机号码 而不是固定电话 固定电话号码 你得到的数字是字符串类型 因此 您可以获取号
  • 一次显示两条Toast消息?

    我希望在一个位置显示一条 Toast 消息 并在另一位置同时显示另一条 Toast 消息 多个 Toast 消息似乎总是按顺序排队和显示 是否可以同时显示两条消息 是否有一种解决方法至少可以提供这种外观并且不涉及扰乱活动布局 Edit 看来
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 实现滚动选择 ListView 中的项目

    我想使用 ListView 您可以在其中滚动列表来选择一个项目 它应该像一个 Seekbar 但拇指应该是固定的 并且您必须使用该栏来调整它 我面临的一个问题是 我不知道这种小部件是如何调用的 这使得我很难搜索 所以我制作了下面这张图片 以

随机推荐