如何通过Intents打开电子邮件程序(但只有一个电子邮件程序)
我想设置我的应用程序的一部分,允许用户发送一个快速的电子邮件给另一个用户。 设置这个不是很难:
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);
然而,问题在于ACTION_SEND不仅仅被电子邮件程序所接受 – 例如,在我的手机上,Facebook应用程序,Twitter,reddit是有趣的,甚至蓝牙也可以作为发送这个信息的可行select。 这些消息对于其中的一些(特别是Twitter)来说太长了。
有没有办法将select器限制为仅支持长消息的应用程序(如电子邮件)? 或者有没有办法来检测用户select的应用程序,并适当调整消息?
更改MIMEtypes是答案,这是我在我的应用程序中改变相同的行为。 我用intent.setType("message/rfc822");
感谢Pentium10提供的关于Linkify如何工作的build议,我发现了一个很好的解决scheme。 基本上,你只要创build一个“mailto:”链接,然后调用适当的意图:
Intent intent = new Intent(Intent.ACTION_VIEW); Uri data = Uri.parse("mailto:?subject=" + subject + "&body=" + body); intent.setData(data); startActivity(intent);
这个解决scheme有一些有趣的方面:
-
我正在使用ACTION_VIEW操作,因为这更适合于“mailto:”链接。 您可以不提供特定的操作,但是可能会得到一些不令人满意的结果(例如,它会询问您是否要将链接添加到联系人)。
-
由于这是一个“共享”链接,我只是简单地包括没有电子邮件地址 – 即使这是一个mailto链接。 有用。
-
没有select者参与。 原因是让用户利用默认值; 如果他们已经设置了一个默认的电子邮件程序,那么它会把他们直接转到那个,完全绕过select器(这在我看来很好,你可能会争辩)。
当然,我有很多的技巧,比如正确地编码主题或者身体,但是你应该能够自己解决这个问题。
这对我有效
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..."));
你有没有尝试包括Intent.EXTRA_EMAIL
额外?
Intent mailer = new Intent(Intent.ACTION_SEND); mailer.setType("text/plain"); mailer.putExtra(Intent.EXTRA_EMAIL, new String[]{"name@email.com"}); mailer.putExtra(Intent.EXTRA_SUBJECT, subject); mailer.putExtra(Intent.EXTRA_TEXT, bodyText); startActivity(Intent.createChooser(mailer, "Send email..."));
这可能会限制可用接收器应用程序的列表…
这是一个错字,因为你需要切换你的mimetype:
intent.setType("plain/text"); //Instead of "text/plain"
尝试将MIMEtypes从普通更改为消息
intent.setType("text/message");
试试这个选项:
Intent intentEmail = new Intent(Intent.ACTION_SEND); intentEmail.setType("message/rfc822");
- Android Firebase,只需获取一个子对象的数据
- 我怎样才能以编程方式启动android应用程序信息屏幕?
- 无法parsing:com.google.firebase:firebase-core:9.0.0
- 如何在Android Studio上生成类图(UML)
- 插件太旧,请更新到更新的版本,或设置ANDROID_DAILY_OVERRIDE环境variables
- 如何以编程方式“重新启动”Android应用程序?
- Android Studio错误:错误:CreateProcess错误= 216,此版本的%1与您正在运行的Windows版本不兼容
- Android获取相机位图的方向? 并旋转-90度
- 如何根据Android中的API级别进行条件invalidateOptionsMenu()调用?