如何在不发送消息的情况下在 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 中指定主机、端口和通道

如何在不打开 WhatsApp 的情况下向 WhatsApp 群组发送消息?

如何在不登录的情况下在 Android 中发布到 Facebook Wall?