2011-02-03 131 views

回答

22
Intent email = new Intent(android.content.Intent.ACTION_SEND); 
        email.setType("application/octet-stream");  

编辑:
你可以尝试设置类型"message/rfc822"为好。

试试这个....

+3

WiFi和蓝牙仍然可见。 – efeyc 2012-04-03 11:44:04

+0

如果我必须使用特殊附件类型的类型? – 2013-09-02 08:10:21

+1

@ N-JOY为什么“application/octet-stream”,而不是“message/rfc822”? – 2013-10-22 14:52:56

2

第一种解决方法:试着在你的Intent参数中更具体。添加邮件收件人例如

emailIntent .putExtra(android.content.Intent.EXTRA_EMAIL, new String[] {"[email protected]"}); 

解决方法二:使用package manager找到能够发送邮件的所有应用程序,并选择您要使用的只有这些。

17

@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[] { "[email protected]" }); 
       gmail.setData(Uri.parse("[email protected]")); 
       gmail.putExtra(Intent.EXTRA_SUBJECT, "enter something"); 
       gmail.setType("plain/text"); 
       gmail.putExtra(Intent.EXTRA_TEXT, "hi android jack!"); 
       startActivity(gmail); 
13

这会帮助你。

On your button click : 

Intent email = new Intent(Intent.ACTION_SEND); 
email.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"});   
email.putExtra(Intent.EXTRA_SUBJECT, "subject"); 
email.putExtra(Intent.EXTRA_TEXT, "message"); 
email.setType("message/rfc822"); 
startActivity(Intent.createChooser(email, "Choose an Email client :")); 
15

我没有拿这个答案的功劳,但我相信它给出了这篇文章的最佳答案。

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

改用ACTION_SENDTO,提供mailto:乌里

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

然后,您可以使用选择器通过其他答案建议进行。

回答@PaulLammertsma这里 Android email chooser

0

最好的代码来限制它只能发送电子邮件。将此类型设置为仅发送电子邮件。 i.setType("message/rfc822");

 Intent i = new Intent(Intent.ACTION_SEND); 
     i.setType("message/rfc822"); 
     i.putExtra(Intent.EXTRA_EMAIL , new String[]{"[email protected]"}); 
     i.putExtra(Intent.EXTRA_SUBJECT, "subject of email"); 
     i.putExtra(Intent.EXTRA_TEXT , "body of email"); 
     try { 
      startActivity(Intent.createChooser(i, "Send mail...")); 
     } catch (android.content.ActivityNotFoundException ex) { 
      Toast.makeText(Firstclass.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show(); 
     } 
2

我注意到,这是一个很老的问题,但它是第一个结果为“发送邮件”的解决方案进行搜索时,所有答案都有一个共同的问题:

使用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","[email protected]", 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(); 
} 
0

这是杰克Dsilva和Jignesh Mayani解决方案的组合:

try 
    { 
     Intent gmailIntent = new Intent(Intent.ACTION_SEND); 
     gmailIntent.setType("text/html"); 

     final PackageManager pm = _activity.getPackageManager(); 
     final List<ResolveInfo> matches = pm.queryIntentActivities(gmailIntent, 0); 
     String gmailActivityClass = null; 

     for (final ResolveInfo info : matches) 
     { 
      if (info.activityInfo.packageName.equals("com.google.android.gm")) 
      { 
       gmailActivityClass = info.activityInfo.name; 

       if (gmailActivityClass != null && !gmailActivityClass.isEmpty()) 
       { 
        break; 
       } 
      } 
     } 

     gmailIntent.setClassName("com.google.android.gm", gmailActivityClass); 
     gmailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] { "[email protected]" }); 
     gmailIntent.putExtra(Intent.EXTRA_SUBJECT, "Subject"); 
     gmailIntent.putExtra(Intent.EXTRA_CC, "[email protected]"); // if necessary 
     gmailIntent.putExtra(Intent.EXTRA_TEXT, "Email message"); 
     gmailIntent.setData(Uri.parse("[email protected]")); 
     this._activity.startActivity(gmailIntent); 
    } 

    catch (Exception e) 
    { 
     Intent i = new Intent(Intent.ACTION_SEND); 
     i.putExtra(Intent.EXTRA_EMAIL, new String[] { "[email protected]" }); 
     i.putExtra(Intent.EXTRA_SUBJECT, "Subject"); 
     i.putExtra(Intent.EXTRA_CC, "[email protected]"); // if necessary 
     i.putExtra(Intent.EXTRA_TEXT, "Email message"); 
     i.setType("plain/text"); 
     this._activity.startActivity(i); 
    } 

因此,在首先它会尝试打开Gmail应用程序,并在情况下,用户没有它那么第二种方法将被执行。

5

我和我的应用程序有类似的问题。我最近发现这个链接形式的官方Android开发人员网站,真的有帮助! Common Intents: Email

TL; DR:

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

现在,你将只显示电子邮件客户端!

您可以通过这样添加主题和正文:

intent.putExtra(Intent.EXTRA_SUBJECT, "Subject"); 
intent.putExtra(Intent.EXTRA_TEXT, "Body"); 
3

[解决方案API等级> = 15]

我终于succeded在发送电子邮件带有附件的仅电子邮件客户端。 我写在这里,因为它花了我很多时间,对别人来说可能是有用的。

的问题是:

  • Intent.ACTION_SENDTO需要数据URI(所以你可以指定 “电子邮件地址:” 模式),但它不接受意向:EXTRA_STREAM。

  • Intent.ACTION_SEND接受意向:EXTRA_STREAM(这样你就可以添加 附件),但只需要键入(不包括Data URI所以你不能 指定“电子邮件地址:”模式)。

所以Intent.ACTION_SEND允许用户从几个活动可供选择,即使你的setType(“信息/ RFC822”),因为该应用程序/活动可以管理所有文件类型(tipically的GDrive/Dropbox的应用程序)等甚至是电子邮件文件。

解决方案在setSelector方法中。 使用此方法,您可以使用Intent.ACTION_SENDTO来选择活动,但然后发送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[]{"[email protected]"}); 
    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); 
} 
0

这救了我的一天。它直接发送复合文本消息到Gmail应用程序:

Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts(
         "mailto","togmail.com", null)); 
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Report message"); 
emailIntent.putExtra(Intent.EXTRA_TEXT, edt_msg.getText().toString()); 
startActivity(Intent.createChooser(emailIntent, "Send email..."));