Android Intent Chooser仅显示电子邮件选项

Nea*_*eal 24 android android-intent xamarin.android

我的应用程序集成了电子邮件,用户可以直接从应用程序提交错误报告,反馈等.我正在使用application/octet-stream作为Intent的SetType.当您提交电子邮件时,您将获得内容选择器,并显示来自Evernote,Facebook,电子邮件等的各种项目.

如何让此选择器仅显示电子邮件,以免将用户与适合内容选择器类型的所有其他项目混淆?

谢谢.

Ped*_*ela 32

我用简单的代码行解决了这个问题,如android文档说明(https://developer.android.com/guide/components/intents-common.html#Email)

最重要的是旗帜:它是ACTION_SENDTO,而不是ACTION_SEND

另一条重要的路线是

intent.setData(Uri.parse("mailto:")); ***// only email apps should handle this***
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果你发送一个空的Extra,if()最后将无法正常工作,应用程序将无法启动电子邮件客户端.

这适合我.根据Android文档.如果您想确保仅通过电子邮件应用程序(而不是其他文本消息或社交应用程序)处理您的意图,请使用ACTION_SENDTO操作并包含"mailto:"数据方案.例如:

public void composeEmail(String[] addresses, String subject) {
    Intent intent = new Intent(Intent.ACTION_SENDTO);
    intent.setData(Uri.parse("mailto:")); // only email apps should handle this
    intent.putExtra(Intent.EXTRA_EMAIL, addresses);
    intent.putExtra(Intent.EXTRA_SUBJECT, subject);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 很遗憾不适用于附件:( (2认同)

Com*_*are 14

我假设你正在使用这个ACTION_SEND Intent动作,因为你没有真正说出你正在使用的内容,但是你同意了@Aleadam的评论.

我正在使用application/octet-stream作为Intent的SetType.

该句中没有任何内容限制电子邮件的内容.

ACTION_SENDIntent任何想要的应用程序都可以支持的通用操作.您所做的只是指示您要共享的数据以及该数据的MIME类型 - 从那里,用户可以从可用活动中进行选择.

正如@Jasoon所指出的,您可以尝试message/rfc822MIME类型.但是,这并不表示"仅提供电子邮件客户端" - 它表示"提供支持message/rfc822数据的任何内容".这可能很容易包括一些非电子邮件客户端的应用程序.

如果您特别想通过电子邮件发送内容,请将JavaMail集成到您的应用程序中,或者在Web服务器上编写电子邮件转发脚本并调用它或其他内容.如果您使用ACTION_SEND,则隐含地声明用户想要的是重要的,并且您希望用户能够通过用户选择的任何方式发送某些数据.


Fis*_*bug 6

在实施Magic Link功能时,一直在努力解决这个问题,这是一个针对所有已安装的电子邮件应用的选择器意图:

Chooser Intent截图

private void openEmailApp() {
  List<Intent> emailAppLauncherIntents = new ArrayList<>();

  //Intent that only email apps can handle:
  Intent emailAppIntent = new Intent(Intent.ACTION_SENDTO);
  emailAppIntent.setData(Uri.parse("mailto:"));
  emailAppIntent.putExtra(Intent.EXTRA_EMAIL, "");
  emailAppIntent.putExtra(Intent.EXTRA_SUBJECT, "");

  PackageManager packageManager = getPackageManager();

  //All installed apps that can handle email intent:
  List<ResolveInfo> emailApps = packageManager.queryIntentActivities(emailAppIntent, PackageManager.MATCH_ALL);

  for (ResolveInfo resolveInfo : emailApps) {
    String packageName = resolveInfo.activityInfo.packageName;
    Intent launchIntent = packageManager.getLaunchIntentForPackage(packageName);
    emailAppLauncherIntents.add(launchIntent);
  }

  //Create chooser
  Intent chooserIntent = Intent.createChooser(new Intent(), "Select email app:");
  chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, emailAppLauncherIntents.toArray(new Parcelable[emailAppLauncherIntents.size()]));
  startActivity(chooserIntent);
}
Run Code Online (Sandbox Code Playgroud)