Gmail附件和自定义扩展程序

时间:2011-06-10 08:52:05

标签: android gmail mime-types attachment mime

我目前在使用自定义扩展程序读取文件的Android应用程序上工作。 其中一项强制性功能是,当用户收到带有附件.ourextension的邮件时,必须通过gmail提出该应用。

我做了一些研究,发现Android上的gmail客户端不依赖于扩展,因为在启动意图的数据中提出的文件没有扩展名。它只依赖于邮件客户端给出的mime类型。

问题是我们的自定义文件在邮件客户端之间的检测方式不同。例如,如果我使用gmail网页向自己发送我们的自定义文件,则mime-type将被检测为application / octet-stream。如果我的一个朋友发送苹果邮件桌面软件,它将被检测为text / xml(这将是很好的)。在另一个邮件客户端Evolution上,mime-type是text / plain ...

我们的应用程序无法处理所有这些类型!否则,会建议每种类型的附件......

有没有解决方案?

4 个答案:

答案 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类型的更改设为 / ,并且仅在扩展名上匹配

相关问题