使用Android Intent.ACTION_SEND发送电子邮件

Gan*_*y C 28 email android android-intent

我正在Intent.ACTION_SEND发送电子邮件.但是,当我打电话时,intent它显示选择发送消息,发送电子邮件,以及通过蓝牙发送.我希望它只显示发送电子邮件的选择.我怎样才能做到这一点?

N-J*_*JOY 23

Intent email = new Intent(android.content.Intent.ACTION_SEND);  
                    email.setType("application/octet-stream");    
Run Code Online (Sandbox Code Playgroud)

编辑:
你也可以尝试设置类型"message/rfc822".

试试这个....

  • WiFi和蓝牙仍然可见. (3认同)

too*_*o42 23

我不赞成这个答案,但我相信它给出了这篇文章的最佳答案.

使用text/plain或text/html是一种常见的误解.这将触发任何可以处理普通或HTML文本文件而无任何上下文的应用程序,包括Google Drive,Dropbox,Evernote和Skype.

而是使用a ACTION_SENDTO,提供mailto:Uri

intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:"));
Run Code Online (Sandbox Code Playgroud)

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

由@PaulLammertsma在这里安排 Android电子邮件选择器

  • 完善!这应该是公认的答案,因为它完全符合OP的要求.只是一个FYI:如果也使用了setType(),这将不起作用. (2认同)
  • Intent.ACTION_SENDTO不支持附件。 (2认同)

ARL*_*abs 20

[API LEVEL> = 15的解决方案]

我终于成功发送电子邮件附件只给电子邮件客户端.我在这里写,因为它花了我很多时间,对其他人可能有用.

问题是:

  • Intent.ACTION_SENDTO采用数据URI(因此您可以指定"mailto:"模式)但它不接受Intent:EXTRA_STREAM.

  • Intent.ACTION_SEND接受Intent:EXTRA_STREAM(因此您可以添加附件)但它只接受Type(不是Data URI,因此您不能指定"mailto:"模式).

因此Intent.ACTION_SEND允许用户从多个活动中进行选择,即使你设置了类型("message/rfc822"),因为该应用程序/活动可以管理所有文件类型(简单的GDrive/Dropbox应用程序),甚至是电子邮件消息文件.

解决方案是在setSelector方法中.使用此方法,您可以使用Intent.ACTION_SENDTO选择Activity,但随后发送Intent.ACTION_SEND Intent.

这里是我的解决方案代码(附件来自FileProvider,但它可以是任何文件):

{
    Intent emailSelectorIntent = new Intent(Intent.ACTION_SENDTO);
    emailSelectorIntent.setData(Uri.parse("mailto:"));

    final Intent emailIntent = new Intent(Intent.ACTION_SEND);
    emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{"address@mail.com"});
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
    emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    emailIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
    emailIntent.setSelector( emailSelectorIntent );

    Uri attachment = FileProvider.getUriForFile(this, "my_fileprovider", myFile);
    emailIntent.putExtra(Intent.EXTRA_STREAM, attachment);

    if( emailIntent.resolveActivity(getPackageManager()) != null )
        startActivity(emailIntent);
}
Run Code Online (Sandbox Code Playgroud)

  • 您还可以使用较新的选择器,而不是手动检查包管理器,它还可以处理用户没有电子邮件应用程序时的状态。它还将仅显示电子邮件应用程序。`startActivity(Intent.createChooser(emailIntent, null));` (3认同)

Jac*_*lva 19

@Ganapathy:尝试使用此代码显示gmail

Intent gmail = new Intent(Intent.ACTION_VIEW);
                gmail.setClassName("com.google.android.gm","com.google.android.gm.ComposeActivityGmail");
                gmail.putExtra(Intent.EXTRA_EMAIL, new String[] { "jckdsilva@gmail.com" });
                gmail.setData(Uri.parse("jckdsilva@gmail.com"));
                gmail.putExtra(Intent.EXTRA_SUBJECT, "enter something");
                gmail.setType("plain/text");
                gmail.putExtra(Intent.EXTRA_TEXT, "hi android jack!");
                startActivity(gmail);
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这仅在设备安装了Gmail时才有效.在非Google设备上(例如,拥有自己的电子邮件客户端的Kindle Fire),它将失败. (14认同)

Jig*_*ani 14

这会对你有所帮助.

On your button click : 

Intent email = new Intent(Intent.ACTION_SEND);
email.putExtra(Intent.EXTRA_EMAIL, new String[]{"youremail@yahoo.com"});          
email.putExtra(Intent.EXTRA_SUBJECT, "subject");
email.putExtra(Intent.EXTRA_TEXT, "message");
email.setType("message/rfc822");
startActivity(Intent.createChooser(email, "Choose an Email client :"));
Run Code Online (Sandbox Code Playgroud)

  • 此邮件类型包括谷歌驱动器和Skype等应用程序.无论如何在没有创建选择器的情况下过滤掉那些? (2认同)

Gaw*_*cio 7

使用message/rfc822此处指向的类型:ACTION_SEND强制发送电子邮件解决了问题.


Avi*_*han 6

我的应用程序遇到了类似的问题.我最近发现这个链接形式的官方Android开发者网站真的有帮助! 共同意图:电子邮件

TL; DR:

Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:"));
Run Code Online (Sandbox Code Playgroud)

现在,您只会看到电子邮件客户端!

您可以通过执行以下操作添加主题和正文:

intent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
intent.putExtra(Intent.EXTRA_TEXT, "Body" );
Run Code Online (Sandbox Code Playgroud)


And*_*ord 5

我注意到,这是一个相当古老的问题,但它是搜索“发送邮件”解决方案时的第一个结果,并且所有答案都有一个常见问题:

使用Intent.ACTION_SENDintent.setType("message/rfc822")将产生一个选择器,它不仅显示邮件应用程序,而且显示所有可以通过 message/rfc822处理任何MIME 类型支持的应用程序,例如.mhtml, .mht, .mime. 除了邮件应用程序,这可能是Google Drive、Dropbox、Evernote 等

我发现将选择器限制为仅邮件应用程序的唯一解决方案是改用 Intent.ACTION_SENDTO:

Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto","address@example.com", null));
intent.putExtra(Intent.EXTRA_SUBJECT, "My Mail");
intent.putExtra(Intent.EXTRA_TEXT   , "My Message");

try {
    startActivity(Intent.createChooser(i, "Send mail..."));
} catch (android.content.ActivityNotFoundException ex) {
    Toast.makeText(MainActivity.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
}
Run Code Online (Sandbox Code Playgroud)