我目前在使用自定义扩展程序读取文件的Android应用程序上工作。 其中一项强制性功能是,当用户收到带有附件.ourextension的邮件时,必须通过gmail提出该应用。
我做了一些研究,发现Android上的gmail客户端不依赖于扩展,因为在启动意图的数据中提出的文件没有扩展名。它只依赖于邮件客户端给出的mime类型。问题是我们的自定义文件在邮件客户端之间的检测方式不同。例如,如果我使用gmail网页向自己发送我们的自定义文件,则mime-type将被检测为application / octet-stream。如果我的一个朋友发送苹果邮件桌面软件,它将被检测为text / xml(这将是很好的)。在另一个邮件客户端Evolution上,mime-type是text / plain ...
我们的应用程序无法处理所有这些类型!否则,会建议每种类型的附件......
有没有解决方案?
答案 0 :(得分:3)
使用gmail<测试自定义扩展程序打开文件的解决方案4.2,gmail 4.2,Google Drive和文件浏览器
发送文件的代码:
sendIntent.setType("application/calc1");
意图过滤器:
<!-- Filter to open file with gmail version < 4.2 -->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="application/calc1" />
<data android:pathPattern=".*\\.calc1" />
<data android:host="*" />
</intent-filter>
<!-- Filter to open with file browser or google drive -->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="file" />
<data android:mimeType="*/*" />
<data android:pathPattern=".*\\.calc1" />
<data android:host="*" />
</intent-filter>
<!-- Filter to open file with gmail version 4.2 -->
<!-- Save file first with "save" button otherwise gmail crashes -->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="application/octet-stream" />
<data android:pathPattern=".*\\.calc1" />
<data android:host="*" />
</intent-filter>
答案 1 :(得分:2)
虽然我花了很多时间来弄清楚所有问题,但是有可能从gmail开始工作。
重要意图数据
act=android.intent.action.VIEW
dat=file:///mnt/sdcard/Download/Availability Focus.inform
typ=application/octet-stream
flg=0x80001 cmp=air.com.extension/.AppEntry
能够捕获它的Intent过滤器(下面的一些注释)
<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="file" android:pathPattern=".*\\.inform" android:mimeType="application/octet-stream"/>
<data android:scheme="content" android:pathPattern=".*\\.inform" android:mimeType="application/octet-stream"/>
</intent-filter>
同时需要内容和文件方案。如果没有CONTENT方案,gmail将忽略您的过滤器。这似乎是一个错误。如果没有FILE方案,gmail会抛出错误,说它不知道从intent启动哪个应用程序。
07-19 15:38:19.160: ERROR/Gmail(2220): Coun't find Activity for intent
在两个方案都适用的情况下,应用程序会收到Downloaded和Previewed文件的意图。他们必须以不同的方式处理。
答案 2 :(得分:0)
编辑:这个答案是3岁。我没有时间测试对方的答案,但我的答案显然已经过时,所以请查找其他人的答案!
我没有找到任何解决方案,唯一的工作方式是使用mime-type,所以你必须祈祷你的附件能够被一个已知的mime类型识别,并处理它。如果您的文件被识别为html,则意味着您将干扰其他应用程序。
您需要处理文件无法被应用程序读取的情况,并显示一个弹出窗口,通知用户您无法读取该文件。
也许在一两年内,Gmail会提供良好的API ...
顺便说一句,最后一个gmail版本添加了一个你必须处理的下载按钮以避免崩溃,它的工作方式是使用uri创建一个新文件。
答案 3 :(得分:0)
您仍然可以匹配Gmail的扩展程序
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="application/*" host="*" android:pathPattern=".*\\.mht" android:scheme="content" />
</intent-filter>
将mime类型的更改设为 / ,并且仅在扩展名上匹配