【问题标题】:How to open the default mail inbox from android code?如何从android代码打开默认邮件收件箱?
【发布时间】:2011-12-27 07:03:15
【问题描述】:

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

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

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

【问题讨论】:

    标签: android email android-intent inbox


    【解决方案1】:

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

    How do I launch the email client directly to inbox view?

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

    【讨论】:

      【解决方案2】:
        You can use this but it is for gmail only
      
        Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);  
        emailIntent.setType("plain/text");
        startActivity(emailIntent); 
      

      【讨论】:

      • 对不起,不是那个,而是尝试使用这个:Intent mailClient = new Intent(Intent.ACTION_VIEW); mailClient.setClassName("com.google.android.gm", "com.google.android.gm.ConversationListActivity"); startActivity(mailClient);
      • tnx 供您回复。我刚刚意识到我正在尝试访问 HTC 邮件应用程序,而不是默认邮件应用程序。有没有办法在收件箱中打开那个?或者你能告诉我在哪里可以找到这些信息吗?
      • 如何传递邮件的主题以及 TO 值?
      【解决方案3】:

      如果没有配置设备中的默认邮件,有什么建议可以避免崩溃?

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

      Intent intent = getPackageManager().getLaunchIntentForPackage("com.android.email");
      startActivity(intent);
      


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

      【讨论】:

      • 这是错误的:该解决方案假定用户有一个带有“com.android.email”包的应用程序,并且它是他们使用的默认电子邮件应用程序。例如,如果我有 K9 邮件并将其用作我的默认客户端,则打开股票邮件客户端对我没有用处。目的不是开玩笑,有一个东西叫“网络礼仪”。当您输入所有大写字母时,它被认为是大喊大叫和粗鲁。除此之外,它会使您的文字看起来令人讨厌且难以阅读。有大写和小写字母是有原因的。格式正确的文本比全部大写更易读。
      • 是的,你发现我的错很好,我不完美这个问题并且给出了错误的答案,但是你必须第一次写这个评论而不是你写“帽子真的有必要吗?”如果你知道正确的答案请给我.. bcoz 我只知道这个答案,就像我上面给出的同样的问题,比如“如何从 android 代码打开默认邮件收件箱?”..!
      【解决方案4】:

      您可以使用以下方式打开 Android 默认电子邮件客户端:

      Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
      emailIntent.setType("text/plain");
      emailIntent.setClassName("com.android.email", "com.android.email.activity.Welcome");
      emailIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
      startActivity(emailIntent);
      

      【讨论】:

      • 这是一封新邮件,最初的问题是打开默认的邮件应用。
      【解决方案5】:

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

      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);
          }
      

      【讨论】:

      • 当启动意图无法解决时,这会崩溃——需要再次检查!
      • 这在 android > 11 上无法正常工作。因为 queryIntentActivities 将仅返回设备上已在查询块中的清单中列出的包。 (我们可以添加一组有限的已知邮件应用程序,但这很糟糕......)
      【解决方案6】:

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

      Intent intent = new Intent(Intent.ACTION_MAIN);
      intent.addCategory(Intent.CATEGORY_APP_EMAIL);
      getActivity().startActivity(intent);
      

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

      【讨论】:

      • 我将如何在 React Native 中模仿这一点?
      • @jasan - 你需要创建一个自定义组件来从 js 领域触发这个逻辑
      • 友情提示:这会导致emailActivity打开IN你当前的堆栈(即在你的应用程序中),导致坏用户exp。要在新窗口中打开email,请在启动前添加行intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
      【解决方案7】:

      如果没有附件,您可以简单地使用以下代码:

      Intent i = new Intent(Intent.ACTION_SENDTO);
      i.setData(Uri.parse("mailto:support@mailname.com")); 
      i.putExtra(Intent.EXTRA_SUBJECT, "Feedback/Support");
      startActivity(Intent.createChooser(emailIntent, "Send feedback"));
      

      有关详细信息,我建议您访问: https://developer.android.com/guide/components/intents-common.html#Email

      【讨论】:

        【解决方案8】:
        Intent email = new Intent(Intent.ACTION_MAIN);
                      
        email.addCategory(Intent.CATEGORY_APP_EMAIL);
                            startActivity(email);
        

        【讨论】:

          【解决方案9】:

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

          Intent intent = new Intent(Intent.ACTION_MAIN);
          intent.addCategory(Intent.CATEGORY_APP_EMAIL);
          intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
          startActivity(intent);
          

          【讨论】:

            【解决方案10】:

            对于 kotlin:

            fun composeEmail(addresses: Array<String>, subject: String) {
                val intent = Intent(Intent.ACTION_SENDTO).apply {
                    data = Uri.parse("mailto:") // only email apps should handle this
                    putExtra(Intent.EXTRA_EMAIL, addresses)
                    putExtra(Intent.EXTRA_SUBJECT, subject)
                }
                if (intent.resolveActivity(packageManager) != null) {
                    startActivity(intent)
                }
            }
            

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

            【讨论】:

              【解决方案11】:

              有点晚了,这里是正确的工作代码。

              Intent intent = Intent.makeMainSelectorActivity(
              Intent.ACTION_MAIN,
              Intent.CATEGORY_APP_EMAIL
              );
              intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
              startActivity(Intent.createChooser(intent, "Email"));
              

              欲了解更多详情,请查看此文档:

              1. CATEGORY_APP_EMAIL
              2. makeMainSelectorActivity

              【讨论】:

                【解决方案12】:

                基于答案https://stackoverflow.com/a/28190156/3289338

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

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

                这里有一个 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()
                

                【讨论】:

                  猜你喜欢
                  • 2019-04-17
                  • 2019-09-06
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2022-11-12
                  相关资源
                  最近更新 更多