7

我有一个生成自定义文件类型 (.sor) 的应用程序。在应用程序中,我有一个功能可以发送附有这些文件之一的电子邮件。我还有一个意图过滤器,允许应用程序显示在可以打开此类文件的应用程序列表中。这允许我(有时)直接从手机上的用户电子邮件客户端使用应用程序打开文件。

但是,这仅在电子邮件来自 PC 电子邮件客户端时有效,并且在从电话接收电子邮件时不起作用。例如,如果我生成其中一个 .sor 文件,然后使用我的应用程序向我自己的电子邮件帐户发送电子邮件,我将在手机上收到电子邮件,但无法使用我的应用程序打开附件...但是,如果我将电子邮件发送到同一个帐户并在我的 PC(使用 Thunderbird)而不是手机上打开它,然后转发它或将其作为新电子邮件发送到我的手机,我将能够使用相同的电子邮件应用程序在手机上用我的应用程序打开附件......我在这里只谈论一个电子邮件帐户,唯一的区别是电子邮件是从哪里发送的,我的手机或我的 Windows 7 PC。

我唯一能想到的是,当我从手机发送电子邮件时,附件中嵌入了不同的 mime 类型,而不是我从 PC 上的 Thunderbird 发送电子邮件时......我将 mime 类型指定为“应用程序/ octet-stream" 当我从我的应用程序发送电子邮件时,我有一个意图过滤器来查找这种 mime 类型......但它不能正常工作。

我的意图过滤器:

<intent-filter>
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.DEFAULT" />
  <data android:mimeType="application/octet-stream" />
  <data android:scheme="file" />
</intent-filter>

从手机发送电子邮件附件中的文件时,我传递给手机电子邮件客户端的意图:

Intent sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.setType("application/octet-stream");
sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + fullPathString));
sendIntent.putExtra(Intent.EXTRA_SUBJECT, "FiberDroid OTDR Trace File: \"" + ContextMenuFileName + "\"");
sendIntent.putExtra(Intent.EXTRA_TEXT, "This e-mail was sent from the TTI FiberDroid Android application.");
startActivity(Intent.createChooser(sendIntent, "Select E-Mail Application"));

同样,带有附件的电子邮件的发送工作正常......如果我从 PC 电子邮件客户端(如 Outlook 或 Thunderbird)将相同的文件通过电子邮件发送回手机,那么我可以使用我的应用程序打开文件直接从手机电子邮件应用程序。问题是,如果我在电话上打开电子邮件而不通过我的电脑作为中间人,我将无法打开附件,我得到的唯一选项是“保存到 SD 卡”......

回顾一下,我的手机上有两封相同的电子邮件,附有相同的文件,并且最初都是从我的应用程序发送到同一个帐户(也都是从同一个帐户收到的),但附件中的附件通过了我的电脑作为不必要的中间人可以正常工作,而直接从我的手机发送和接收的电脑则不能。

有任何想法吗?先感谢您。

4

2 回答 2

11

我已经解决了这个问题,主要是通过在黑暗中拍摄并且没有真正理解为什么我做了什么解决了它,但这是我现在在清单中为我的意图过滤器所拥有的,其中“.sor”是我的自定义文件的扩展名类型。这适用于我尝试过的所有电子邮件和文件管理应用程序,包括 K-9 邮件和 Astro:

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

<!--  For file browsers -->
<intent-filter>
   <action android:name="android.intent.action.VIEW"/>
   <category android:name="android.intent.category.DEFAULT"/>
   <data android:mimeType="application/*" host="*" android:pathPattern=".*.sor" android:scheme="file" />
</intent-filter>
于 2012-09-18T13:09:19.213 回答
0

Tim Autin 对这个问题的示例Android Intent filter not working对我有用。他使用了三个意图过滤器:

  • 一种用于支持的 mime 类型
  • 一种用于具有通配符 mime 类型的文件扩展名<data android:mimeType="*/*" />
  • 一种用于完全没有 mime 类型标签的文件扩展名

mime 类型和文件扩展名的组合受到限制,最终与我的文件扩展名完全不匹配

于 2021-04-29T15:25:07.820 回答