从 Android 上的 gmail 应用程序下载附件的意图过滤器

Posted

技术标签:

【中文标题】从 Android 上的 gmail 应用程序下载附件的意图过滤器【英文标题】:Intent filter to download attachment from gmail apps on Android 【发布时间】:2011-12-30 05:20:16 【问题描述】:

我有带有意图过滤器 (ACTION_VIEW) 的 android 应用程序来打开文件并将其导入我的应用程序。我希望将 gmail 应用程序中的文件附件下载到我的应用程序中。某些文件类型(即 jpg、png、txt)已正确保存,但有些则未正确保存(即 doc、xls、ppt)。我相信我的活动具有正确的意图过滤器,因为它适用于其他应用程序(即保管箱),但不适用于 gmail 应用程序。有什么解决方案吗?

【问题讨论】:

【参考方案1】:

通过删除我的意图中的方案数据过滤器(删除方案行并试一试),我能够在 GMail 中的 Android 上弹出下载和预览按钮:

<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" />
<data android:mimeType="*/*" />
<data android:pathPattern=".*\\.ext" />
<data android:host="*" />
</intent-filter>

但是,根据 Android 文档,“如果未为意图过滤器指定方案,则忽略所有其他 URI 属性。”移除 scheme 和 URI 属性后,过滤意图的唯一其他方法是使用 Mime 类型,我们都知道自定义文件扩展名没有注册的 mime 类型。

作为参考,URI 的格式为:

方案://主机:端口/路径 路径前缀 路径模式

因此,如果没有计划,所有这些都会下降。发现上述情况后,我尝试了明显的——使用“*”作为方案,甚至尝试了“.*”。这些都不起作用。我希望其他人可以建立我的试验。但我相信这与选择正确的方案有关。不幸的是,我知道的唯一方案是http https内容和文件,以上都不是灵丹妙药。

编辑:::::::::

我昨天解决了这个问题。请看我的解决方案:

<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="application/*" host="*" android:pathPattern=".*.ext" android:scheme="content" />
</intent-filter>

此意图将导致 gmail 显示下载/预览按钮。事实上,当 .ext 文件作为附件发送到常规电子邮件客户端时,这也会导致您的应用程序打开。

【讨论】:

应用需要什么权限才能读取预览按钮发布的 GMail 'content' URI?我的应用程序没有权限,当我尝试打开它时,我得到了无权限异常。阅读“下载”按钮发布的“文件”数据没有问题。 用户——不知道。我的应用程序中有以下权限,但由于用途不同,我添加了它们,而不是用于 GMail 预览/下载。您是否还可以验证我发布的意图是否会导致显示 gmail 下载/预览?我知道我自己已经在 Froyo、姜饼和冰淇淋三明治中测试过它,并且在所有这些中都对我有用。 这会导致每当我在通知栏中收到新的 gmail 并打开它时触发我的过滤意图。还有其他人有这个问题吗?肯定是这个过滤器造成的。 正如前面的评论所提到的,将 mime-type 设置为 application/* 意味着用户将获得一个选择器,要求在 Gmail/Email 和您的应用程序中打开所有新的电子邮件通知。改为使用:&lt;data android:mimeType="application/octet-stream" android:host="*" android:pathPattern=".*\\.extension" /&gt; 谢谢你理查德莱格特!你的解决方案奏效了。经过数周的搜索和反复试验,你终于做到了。您应该自己回答问题,以便人们可以更好地看到您的答案【参考方案2】:

由于这是谷歌与“gmail 附件意图过滤器”相关的首要问题之一,我发现上面的答案在我的情况下不起作用,所以我发布了我的研究结果。

为了从gmail注册intents,我们需要支持内容方案:

<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:scheme="content" android:mimeType="*" android:host="*" />
</intent-filter>

对于我测试的附件,URI 不包含文件扩展名,即使它显示在 gmail 中,所以使用 android:pathPattern 会阻止接收 gmail 意图。

由于注册到所有 mimeTypes 是一个矫枉过正的事实,我调试了 Intent 对象的内容(在 Java 端)并发现在我的应用程序中 text/plain 就足够了(所以你的作业是为你的应用)。我的最终意图过滤器如下所示:

<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:scheme="content" android:mimeType="text/plain" android:host="*" />
</intent-filter>

【讨论】:

android:scheme="file" 怎么样。不需要吗?

以上是关于从 Android 上的 gmail 应用程序下载附件的意图过滤器的主要内容,如果未能解决你的问题,请参考以下文章

如何从 gmail 下载许多电子邮件附件

如何让用户浏览器直接从 GMAIL 下载 gmail 附件?

检索从 gmail 下载的文件表单附件中的内容,因为它存储在 gmail 服务器中

如何从我的 Android 应用程序访问新的 Gmail API?

我的 android 应用程序无法从最新设备上的 playstore 下载

从链接或电子邮件启动 Android 应用程序