【问题标题】:Android email chooserAndroid 电子邮件选择器
【发布时间】:2011-04-28 02:41:00
【问题描述】:

我正在编写一个需要在每次交易结束时发送电子邮件的应用程序。我正在执行以下操作:

Intent mail = new Intent(Intent.ACTION_SEND);
mail.setType("text/html");
mail.putExtra(Intent.EXTRA_EMAIL, new String[] { emailTo });
mail.putExtra(Intent.EXTRA_SUBJECT, "Send from Android");
mail.putExtra(Intent.EXTRA_TEXT, "Sent from Android");
startActivity(Intent.createChooser(mail,"Select Email Software..."));

我想做的是预先选择电子邮件软件并将其存储在设置中。这样,每次发送电子邮件时,它都不必询问用户使用哪个电子邮件。我似乎无法弄清楚如何调用选择器并获取选定的值。

任何帮助将不胜感激。

【问题讨论】:

    标签: android email android-intent


    【解决方案1】:

    您必须创建自己的选择器,可能是使用在PackageManager 上调用queryIntentActivities() 的结果填充的AlertDialog

    【讨论】:

      【解决方案2】:

      解决办法如下:

      private void setSpinnerValues() {
          Intent intent = new Intent(Intent.ACTION_SEND);
          intent.setType("text/html");
          PackageManager pm = getPackageManager();
          emailers = pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY | PackageManager.GET_RESOLVED_FILTER);
      
          if (emailers.size() == 0) {
              spnEmailProgram.setEnabled(false);
              return;
          }
          spnEmailProgram.setEnabled(true);
          CharSequence[] sa = new CharSequence[emailers.size()];
          int lastPosition = 0;
          for (int i = 0; i < emailers.size(); i++) {
              ResolveInfo r = emailers.get(i);
              sa[i] = pm.getApplicationLabel(r.activityInfo.applicationInfo);
              if (r.activityInfo.name.equalsIgnoreCase(Options.EmailClass)) {
                  lastPosition = i;
              }
          }
          ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(this,
                  android.R.layout.simple_spinner_item, sa);
          adapter.
                    setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
          spnEmailProgram.setAdapter(adapter);
          spnEmailProgram.setSelection(lastPosition);
      }
      

      保存选择以备后用:

          if (emailers.size() == 0) {
              Options.EmailProgram = "";
              Options.EmailClass = "";
          } else {
              ResolveInfo r = emailers.get(spnEmailProgram.getSelectedItemPosition());
              Options.EmailProgram = r.activityInfo.packageName;
              Options.EmailClass = r.activityInfo.name;
          }
      

      现在,要使用它,只需执行以下操作:

      Intent mail = new Intent(Intent.ACTION_SEND);
      mail.setType("text/html");
      Intent chooser = null;
      if (Options.EmailProgram!=null && Options.EmailProgram.length()>0) {
        mail.setClassName(Options.EmailProgram,Options.EmailClass);
        chooser = mail;
      }
      

      填写其余数据并开始活动

      if (chooser == null) {
        chooser = Intent.createChooser(mail,"Select Email Software..."); 
      }
      startActivity(chooser);
      

      【讨论】:

      • 慎用new Intent(Intent.ACTION_SEND).setType("text/html");其语义是发送一个 HTML 文件。大多数电子邮件客户端只是“巧合”地符合这一意图,但请记住,许多其他应用程序也符合这一意图,例如 Drive、Dropbox 和 Skype。更好的技术是使用 ACTION_SENDTO 并指定 mailto: Uri 方案。
      【解决方案3】:

      使用text/plaintext/html 是一种常见的误解。这将触发任何可以在没有任何上下文的情况下处理纯文本或 HTML 文本文件的应用程序,包括 Google Drive、Dropbox、Evernote 和 Skype。

      改为使用ACTION_SENDTO,提供mailto: Uri:

      intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:"));
      

      然后,您可以按照其他答案的建议继续使用选择器。

      【讨论】:

      • 最后,一个只显示邮件客户端的答案。我注意到一件事。默认情况下,这将选择已选择 GMail,而不是允许用户首先选择哪个电子邮件客户端。你如何解决这个问题?
      • @toobsco42 您可能已将 Gmail 设置为默认处理程序。
      • 其实我去Email应用上设置了一个账户。然后我卸载了我的应用程序并重新安装了我的应用程序并看到了同样的情况。
      • @toobsco42 这与您的应用无关;您可能已将 Gmail 设置为所有 mailto: 意图的默认处理程序。要清除此默认设置,请转到 Gmail 的 Android 应用程序设置,然后清除其默认设置。如果您想在您的应用程序中提供特殊处理,您可以改为查询 PackageManager,例如构造一个选择器来显示所有能够处理意图的应用程序。
      • 我刚刚清除了 Gmail 应用程序的默认设置。然后卸载并重新安装了我的应用程序。仍然会自动选择 Gmail 应用程序。这不是一个大问题,我只是想知道为什么我看到其他选择器不会自动选择选项。
      猜你喜欢
      • 2016-10-23
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      • 2012-12-10
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 2010-12-20
      相关资源
      最近更新 更多