如何通过Intent打开电子邮件程序(但只有一个电子邮件程序)

Dan*_*Lew 72 android

我想设置我的应用程序的一部分,允许用户向另一个用户发送快速电子邮件.设置它并不是很难:

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
intent.putExtra(Intent.EXTRA_TEXT, message);
Intent mailer = Intent.createChooser(intent, null);
startActivity(mailer);
Run Code Online (Sandbox Code Playgroud)

然而,问题在于ACTION_SEND不仅仅被电子邮件程序所接受 - 例如,在我的手机上,Facebook应用程序,Twitter,reddit很有趣,甚至蓝牙也可以作为发送此消息的可行替代方案.对于其中一些(特别是Twitter)来说,这个消息太长了.

有没有办法将选择器限制为只支持长消息(如电子邮件)的应用程序?或者有没有办法检测用户选择的应用程序并适当调整消息?

Dan*_*Lew 88

感谢Pentium10建议搜索Linkify如何工作,我找到了一个很好的解决方案.基本上,您只需创建一个"mailto:"链接,然后为此调用相应的Intent:

Intent intent = new Intent(Intent.ACTION_VIEW);
Uri data = Uri.parse("mailto:?subject=" + subject + "&body=" + body);
intent.setData(data);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

这个解决方案有一些有趣的方面:

  1. 我正在使用ACTION_VIEW操作,因为这更适合"mailto:"链接.您可以不提供任何特定操作,但是您可能会得到一些不满意的结果(例如,它会询问您是否要将链接添加到您的联系人).

  2. 由于这是一个"共享"链接,我只是不包含电子邮件地址 - 即使这是一个mailto链接.有用.

  3. 没有选择参与者.这样做的原因是让用户利用默认值; 如果他们已经设置了一个默认的电子邮件程序,那么它会直接接受它,完全绕过选择器(这在我看来似乎很好,你可能会反驳).

当然我有很多技巧(例如正确编码主题/正文),但你应该能够自己解决这个问题.

  • 如果有人需要,你可以用"&to"指定接收者 (3认同)
  • 这是最好的方法imo,因为它没有显示Snapchat,Telegram和其他允许文本发送的应用程序 (2认同)

小智 81

改变MIME类型就是答案,这就是我在我的应用程序中所做的更改相同的行为.我用了intent.setType("message/rfc822");

  • 我使用新的Intent(Intent.ACTION_SENDTO,Uri.parse("mailto:")); (9认同)
  • 我不认为每个电子邮件程序都支持该MIME类型. (2认同)
  • 在我的设备中,它列出了Gmail,还有"Drive"和"AndFTP" (2认同)

Har*_*man 28

这对我有用

Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
emailIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
emailIntent.setType("vnd.android.cursor.item/email");
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] {"abc@xyz.com"});
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "My Email Subject");
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "My email content");
startActivity(Intent.createChooser(emailIntent, "Send mail using..."));
Run Code Online (Sandbox Code Playgroud)