如何在不发送消息的情况下在 Android 中打开默认电子邮件客户端?
Posted
技术标签:
【中文标题】如何在不发送消息的情况下在 Android 中打开默认电子邮件客户端?【英文标题】:How to open default email client in Android, without sending a message? 【发布时间】:2019-06-09 10:15:15 【问题描述】:我正在寻找一种在 android 上打开默认电子邮件应用程序的方法,但不使用它来发送消息。我知道我可以使用mailto://
或意图参数来做到这一点,但这会自动打开新的消息屏幕。我想要归档的只是打开应用程序本身。
到目前为止,我已经尝试过
override fun startEmailApplication()
val intent = Intent(Intent.ACTION_MAIN)
intent.addCategory(Intent.CATEGORY_APP_EMAIL)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)
但每次我得到
android.content.ActivityNotFoundException: No Activity found to handle Intent act=android.intent.action.VIEW cat=[android.intent.category.APP_EMAIL] flg=0x10000000
通过安装电子邮件应用程序(AquaMail、Outlook)。
【问题讨论】:
这不是你现在使用CATEGORY_APP_EMAIL
的方式。见the documentation。您应该将其与makeMainSelectorActivity()
一起使用。在最近的一个项目中,我们试图做您正在寻找的事情(转到用户电子邮件应用程序的收件箱),但我们放弃了这项工作,因为从根本上不可靠。
【参考方案1】:
我会在一些小事上使用组合。
检测给定 Intent 的响应包:
Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setType("text/plain");
List<ResolveInfo> resolveInfos = getPackageManager().queryIntentActivities(intent, 0);
boolean canResolve = resolveInfos.size() > 0;
这将列出响应此类 Intent 的可用包。使用queryIntentActivities()
允许我检索ResolveInfo
,它会公开有关应用程序的更多信息。
选择第一个并使用它的 packageName 打开它:
if (resolveInfos.size() > 0)
startActivity(getPackageManager().getLaunchIntentForPackage(resolveInfos.get(0).resolvePackageName))
您也不会收到ActivityNotFoundException
,因为我们事先会检查是否有某些内容会回复我们的Intent
。请随时在else
中处理失败的案例。
【讨论】:
【参考方案2】:您可以执行以下操作:
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_APP_EMAIL);
getActivity().startActivity(intent);
【讨论】:
以上是关于如何在不发送消息的情况下在 Android 中打开默认电子邮件客户端?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不打开任何对话框的情况下在 Facebook 上发布消息?
如何在不破坏相机应用程序的情况下在Android手机上打开手电筒[重复]
如何在不使用模拟位置的情况下在 android 上欺骗位置?
如何在不使用 JNDI 的情况下在 ConnectionFactory 中指定主机、端口和通道