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

时间:2011-11-16 08:24:23

标签: android download android-intent gmail attachment

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

2 个答案:

答案 0 :(得分:8)

我能够通过删除我的意图中的方案数据过滤器在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文档,“如果没有为intent过滤器指定方案,则忽略所有其他URI属性。”删除了scheme和URI属性后,过滤意图的唯一方法是使用Mime类型,我们都知道自定义文件扩展名没有注册的mime类型。

供参考,URI的格式为:

  • 方案://主机:端口/路径
  • pathPrefix
  • pathPattern

所以没有方案,所有这些都会下降。在发现上述内容之后,我尝试了显而易见的 - 使用“*”作为方案,甚至尝试了“。*”。这些都没有奏效。我希望其他人可以继承我的考验。但我认为这与选择正确的方案有关。不幸的是,我所知道的唯一方案是http https内容和文件,以上都不是神奇的子弹。

EDIT ::::::::

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

<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文件作为附件发送到常规电子邮件客户端时,这也会导致您的应用程序打开。

答案 1 :(得分:0)

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

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

<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就足够了(所以你的功课就是为你找到合适的mimeTypes)应用)。我的最终意图过滤器看起来像这样:

<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>