如果WhatsApp不是邮件应用程序,为什么Intent.EXTRA_EMAIL在选择器对话框中导致WhatsApp选项?

时间:2018-06-25 12:37:50

标签: android android-intent intentfilter

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("email/text");
intent.putExtra(Intent.EXTRA_EMAIL, new String[]"foo@gmail.com"});
startActivity(Intent.createChooser(intent,"Send Mail"));

在此选择器对话框中,我得到“ GMail”之类的选项,并且工作正常。当我选择Gmail应用程序时,它会根据需要以"foo@gmail.com"的形式填充“收件人”(收件人)。

我的问题是,当WhatsApp 不能处理此类意图时,为什么此选择器还会显示“ WhatsApp”。即使我选择WhatsApp并尝试发送消息,它也不会执行任何操作(因为WhatsApp无法像电子邮件应用程序那样处理填充“收件人”的意图)。该应用程序不会崩溃。

现在,我了解到WhatsApp可能正在听取此意图,因为类型包括“文本”,但是如果我尝试使用:

intent.setType("email");

选择器对话框显示“没有应用程序执行此功能”。

现在,这是WhatsApp开发人员的错吗?还是我使用错误的发送意图(然后应该如何使用)?

我希望我已经说清楚了,请问其他需要知道的事情。

谢谢!

1 个答案:

答案 0 :(得分:1)

  

在此选择器对话框中,我得到了类似“ GMail”的选项,并且运行正常。

这意味着Gmail必须支持MIME类型的*/*通配符模式,因为email/text不是有效的MIME类型。

  

我的问题是,当WhatsApp无法处理此类意图时,为什么此选择器还会显示“ WhatsApp”

WhatsApp应用程序的开发人员认为他们可以处理这样的Intent

  

即使我选择WhatsApp并尝试发送消息,它也不会执行任何操作(因为WhatsApp无法像电子邮件应用程序那样处理填充“收件人”的意图)。

WhatsApp忽略EXTRA_EMAIL的事实是完全合理的。 ACTION_SEND是一个请求,而不是命令。 EXTRA_EMAIL建议,而不是命令。例如,在Gmail的EXTRA_EMAIL实施中,无需任何注意ACTION_SEND。碰巧是这样做的,但是并不能假设所有ACTION_SEND的实现都会关注EXTRA_EMAIL

  

如果我尝试使用intent.setType("email");,则选择器对话框显示“没有应用程序执行此功能”。

这是因为email不具有MIME类型的结构。

  

还是我使用错误的发送意图(然后应该如何使用)?

Android中没有“邮件发送意图”。

您的ACTION_SEND Intent没有要发送的任何内容,因为它既没有EXTRA_TEXT也没有EXTRA_STREAM。结果,有ACTION_SEND个活动的很多对您的Intent没有任何帮助。

The JavaDocs for ACTION_SEND有点难以理解,但是它解释了ACTION_SEND Intent的用途以及设置方法。该文档中还有thisthis也可能有用。