【问题标题】:Android: Associate app with custom file typeAndroid:将应用与自定义文件类型相关联
【发布时间】:2015-12-15 22:15:21
【问题描述】:

我有一个文件类型,扩展名为“.rfts”(实际上它只是存储一个 JSON 字符串,表示音频放大器的用户配置)。当它是来自电子邮件(例如 Gmail)的附件时,我希望能够打开此文件,以便我可以从另一台平板电脑导入用户设置。

这是我的清单的样子(请注意,我没有在其中包含其他活动,但还有 4 个其他活动没有意图过滤器)。

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/RFtheme" >
    <activity
        android:name=".activity.MainActivity"
        android:screenOrientation="landscape"
        android:windowSoftInputMode="adjustPan" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        <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="file"/>
            <data android:mimeType="*/*"/>

            <data android:pathPattern="\\.rfts$"/>
            <data android:host="*"/>
        </intent-filter>
    </activity>

    <provider
        android:name=".model.FileProvider"
        android:authorities="com.rockfordcorp.app3sixty.provider"
        android:enabled="true"
        android:exported="true" >
    </provider>
</application>

我一直在尝试其他几个问题的其他建议修复,但它们是针对从浏览器打开 pdf 之类的。

当我尝试在 Gmail 中打开 .rfts 附件时,它告诉我“您没有可以打开此文件 (.rfts) 的应用程序。尝试在 google play 中搜索可以打开的应用程序” em>

我不知道我需要在这里做什么。我不知道 Gmail 将使用什么 mime 来打开 .rfts,也不知道它将使用什么方案。我尝试了几种不同的组合,但没有任何效果。我只是没有加入 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"/>
            <data android:scheme="file" android:mimeType="*/*" android:pathPattern=".*\\.rfts"/>
            <data android:scheme="content" android:pathPattern=".*\\.rfts" android:mimeType="application/octet-stream" />
            <!-- <data android:host="*"/> -->
        </intent-filter>

没有 android:sceheme="content" 它将无法工作。

然而,一个新的问题出现了。 Gmail 现在会打开以前未与其他应用关联的所有文件类型。例如,如果我要尝试打开一个 .rfff 文件,它会使用我的应用程序。如果您尝试打开 .txt,它会打开 Chrome 或 HTML 查看器的选择器。

这很接近,但它打开其他文件类型是有问题的。 Android:pathPattern 显然对我的应用关联的文件类型没有影响。

由于这个问题被标记为可能重复,我想指出建议的解决方案不适用于从 g-mail 而不是 web 打开文件,也不包括打开 自定义文件类型。使用换出文件类型的“解决方案”会导致 g-mail 继续坚持设备上没有能够打开文件类型的应用程序。

可能需要提供不同的解决方案来关联通过来自 Gmail 的意图打开此自定义文件类型。

【问题讨论】:

  • 我相信这个问题的答案会让你走上正确的道路:stackoverflow.com/questions/1733195/…
  • 请注意,您建议的问题是重复的,用于从网络打开,而我的问题是从 gmail 中打开。该问题的解决方案适用于此。
  • 另外请注意,我没有从浏览器打开已建立的文件类型。事实证明,将应用程序与要通过 gmail 打开的文件类型相关联完全需要一个不同的解决方案。我已经更新了我的问题以反映这一点。
  • 嘿@MagicMarbles 我也遇到了同样的问题。请告诉我你是否有任何解决方案?

标签: android file-association


【解决方案1】:

2020 年更新

Android 已向意图过滤器的内容 URI 和 MIME-Type 发展。

问题

内容 URI 不一定必须包含文件的扩展名或名称,并且在提供内容/文件的不同应用程序之间会有所不同。

以下是来自不同电子邮件应用程序的一些示例内容 URI,用于相同电子邮件附件:

Gmail -> content://com.google.android.gm.sapi/some_email@gmail.com/message_attachment_external/%23thread-a%3Ar332738858767305663/%23msg-a%3Ar-5439466788231005876/0.1?account_type=com.google&amp;mimeType=application%2Foctet-stream&amp;rendition=1

展望 -> content://com.microsoft.office.outlook.fileprovider/outlookfile/data/data/com.microsoft.office.outlook/cache/file-download/file--2146063402/filename.customextention

三星电子邮件应用程序 -> content://com.samsung.android.email.attachmentprovider/1/1/RAW

正如所见,它们都是不同的,并且不保证包含与您的实际文件相关的任何内容。因此,您不能像大多数人建议的那样使用android:pathPattern

电子邮件附件的解决方案

<intent-filter>
    <action android:name="android.intent.action.VIEW"/>

    <category android:name="android.intent.category.BROWSABLE"/>
    <category android:name="android.intent.category.DEFAULT"/>

    <data android:scheme="content"/>
    <data android:host="*"/>

    <!--  Required for Gmail and Samsung Email App  -->
    <data android:mimeType="application/octet-stream"/>

    <!--  Required for Outlook  -->
    <data android:mimeType="application/my-custom-extension"/>
</intent-filter>

通过测试,我找到了 Gmail、Outlook 和三星电子邮件使用的 MIME 类型,并将它们添加到我的意图过滤器中。

注意事项/注意事项

  • 我发现通过上述解决方案,如果我打开任何二进制类型的文件,它会自动启动我的应用程序。如果我们无法解析文件,我会在我的活动中通过显示失败状态来处理此问题。我认为这是一个非常罕见的事件,所以可以接受。

  • 如果不将&lt;data android:mimeType="*/*"/&gt; 添加到我的意图过滤器,我找不到任何方法来通过文件浏览器启动我的应用程序。我不能使用它,因为它会在用户点击手机上的 any 文件(不仅仅是自定义文件扩展名)时启动我的应用程序。我不建议将其添加到您的意图过滤器中。

  • 我在使用android:scheme="file" 时一点运气都没有。

  • 我在搭载 Android 10 的三星 Galaxy S10 上对此进行了测试

最后的想法

  • 目前没有优雅的解决方案可以将您的应用与 Android 中的特定扩展类型相关联。这是我在我的情况下能做的最好的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 2014-05-03
    • 2012-01-29
    • 2011-02-15
    相关资源
    最近更新 更多