从 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 和您的应用程序中打开所有新的电子邮件通知。改为使用:<data android:mimeType="application/octet-stream" android:host="*" android:pathPattern=".*\\.extension" />
谢谢你理查德莱格特!你的解决方案奏效了。经过数周的搜索和反复试验,你终于做到了。您应该自己回答问题,以便人们可以更好地看到您的答案【参考方案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 服务器中
如何从我的 Android 应用程序访问新的 Gmail API?