如何从android代码打开默认邮件收件箱?

San*_*art 16 email android inbox android-intent

我正在尝试将按钮链接到邮件应用程序.不发送邮件,只是打开收件箱.

我应该这样做Intent intent = new Intent(...)吗?

如果是这样,那之间应该是什么( )

Ben*_*Yee 27

如果目标是打开默认电子邮件应用程序以查看收件箱,那么关键是添加意图类别并使用ACTION_MAIN意图,如下所示:

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_APP_EMAIL);
getActivity().startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

https://developer.android.com/reference/android/content/Intent.html#CATEGORY_APP_EMAIL

  • 友好提醒:这将导致“电子邮件”活动在当前堆栈中(即在您的应用程序中)打开,从而导致不良的用户体验。要在新窗口中打开“电子邮件”,请在启动之前添加行“intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)”。 (9认同)

Tim*_*imo 8

基于答案/sf/answers/1973310951/

从 Android 11 开始,系统不会为 queryIntentActivities 返回任何内容,因为我们首先需要在查询中(在清单中)添加一个条目,如下所示

<manifest ...>

<queries>
    ...
    <intent>
      <action
        android:name="android.intent.action.VIEW" />
      <data
        android:scheme="mailto" />
    </intent>
</queries>

...

</manifest>
Run Code Online (Sandbox Code Playgroud)

这是解决方案的 kotlin 版本:

fun Context.openMailbox(chooserTitle: String) {
    val emailIntent = Intent(Intent.ACTION_VIEW, Uri.parse("mailto:"))

    val resInfo = packageManager.queryIntentActivities(emailIntent, 0)
    if (resInfo.isNotEmpty()) {
        // First create an intent with only the package name of the first registered email app
        // and build a picked based on it
        val intentChooser = packageManager.getLaunchIntentForPackage(
            resInfo.first().activityInfo.packageName
        )
        val openInChooser = Intent.createChooser(intentChooser, chooserTitle)

        // Then create a list of LabeledIntent for the rest of the registered email apps
        val emailApps = resInfo.toLabeledIntentArray(packageManager)

        // Add the rest of the email apps to the picker selection
        openInChooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, emailApps)
        startActivity(openInChooser)
    } else {
        Timber.e("No email app found")
    }
}

private fun List<ResolveInfo>.toLabeledIntentArray(packageManager: PackageManager): Array<LabeledIntent> = map {
    val packageName = it.activityInfo.packageName
    val intent = packageManager.getLaunchIntentForPackage(packageName)
    LabeledIntent(intent, packageName, it.loadLabel(packageManager), it.icon)
}.toTypedArray()
Run Code Online (Sandbox Code Playgroud)


小智 7

这段代码对我有用。它会打开一个选择器,其中包含已注册到设备并直接发送到收件箱的所有电子邮件应用程序:

Intent emailIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("mailto:"));
    PackageManager pm = getPackageManager();

    List<ResolveInfo> resInfo = pm.queryIntentActivities(emailIntent, 0);
    if (resInfo.size() > 0) {
        ResolveInfo ri = resInfo.get(0);
        // First create an intent with only the package name of the first registered email app
        // and build a picked based on it
        Intent intentChooser = pm.getLaunchIntentForPackage(ri.activityInfo.packageName);
        Intent openInChooser =
                Intent.createChooser(intentChooser,
                        getString(R.string.user_reg_email_client_chooser_title));

        // Then create a list of LabeledIntent for the rest of the registered email apps 
        List<LabeledIntent> intentList = new ArrayList<LabeledIntent>();
        for (int i = 1; i < resInfo.size(); i++) {
            // Extract the label and repackage it in a LabeledIntent
            ri = resInfo.get(i);
            String packageName = ri.activityInfo.packageName;
            Intent intent = pm.getLaunchIntentForPackage(packageName);
            intentList.add(new LabeledIntent(intent, packageName, ri.loadLabel(pm), ri.icon));
        }

        LabeledIntent[] extraIntents = intentList.toArray(new LabeledIntent[intentList.size()]);
        // Add the rest of the email apps to the picker selection
        openInChooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, extraIntents);
        startActivity(openInChooser);
    }
Run Code Online (Sandbox Code Playgroud)


Fax*_*yev 7

要打开它的新任务,请使用以下代码:

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_APP_EMAIL);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)


May*_*ola 6

是的,可以打开Android默认电子邮件收件箱.
使用此代码:

Intent intent = getPackageManager().getLaunchIntentForPackage("com.android.email");
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)


此代码有效,您必须先配置Android设备默认邮件.如果您已经配置了邮件,它可以正常工作.否则,它强制关闭NullPointerException.

  • 这是错误的:该解决方案假设用户有一个带有"com.android.email"包的应用程序,并且它是他们使用的默认电子邮件应用程序.如果我有,例如,K9邮件,我使用它作为我的默认客户端,打开股票邮件客户端对我没用.意图不是取笑,这就是所谓的"互联网礼仪".当你输入所有大写字母时,它被认为是SHOUTING和粗鲁.除此之外,它使您的文字看起来令人讨厌并且难以阅读.有资本和小写字母的原因.格式正确的文本比ALL CAPS更具可读性. (4认同)
  • 是的,你发现我的错是好的,我不完全是这个问题并给出了错误的答案,但是你必须先写下这个评论,而不是写下"那些帽子真的有必要吗?" 如果你知道正确的答案PLZ给我.. bcoz我只知道这个答案,因为我上面给出了同样的问题,如"如何从Android代码打开默认邮件收件箱?"..! (3认同)
  • 你知道,当有人给出答案时,试着找出堆栈溢出的对错,而不是寻找帽子或小,如果你想采取这种有趣的尝试另一个有趣的网站不是这种编程网站 (2认同)

Cra*_*igy 0

不幸的是,它看起来并不乐观。之前已经问过这个问题

如何启动电子邮件客户端直接进入收件箱视图?

您可以在撰写模式下打开电子邮件客户端,但您似乎已经知道这一点。