启动 Gmail 应用的 Intent URI

41

有没有一个可以指向安卓GMAIL应用并帮助我启动它的URI?

19个回答

74

这可以用来仅针对 Gmail 应用程序进行意图操作。

final Intent intent = new Intent(Intent.ACTION_VIEW)
    .setType("plain/text")
    .setData(Uri.parse("test@gmail.com"))
    .setClassName("com.google.android.gm", "com.google.android.gm.ComposeActivityGmail")
    .putExtra(Intent.EXTRA_EMAIL, new String[]{"test@gmail.com"})
    .putExtra(Intent.EXTRA_SUBJECT, "test")
    .putExtra(Intent.EXTRA_TEXT, "hello. this is a message sent from my demo app :-)");
startActivity(intent);

用于处理大量电子邮件:

intent.putExtra(Intent.EXTRA_EMAIL, new String[] { "test@gmail.com" });

对于单个电子邮件:

intent.setData(Uri.parse("test@gmail.com"));
您可以添加extra putExtra(Intent.EXTRA..) 并更改 setType 来达到您的目的。 :P
更新(1/22/14): 需要注意的是,如果您要使用此代码,请检查用户设备上是否安装了“ com.google.android.gm”包。在任何语言中,务必检查特定字符串和初始化是否为null。
请参阅在Android上从另一个应用程序启动应用程序

enter image description here


1
运行得很好!同时,sendIntent.setData(Uri.parse("abc@gmail.com"))似乎是不必要的。 - Oleksii Malovanyi
3
存在负投票是因为手动将软件包设置为“com.google.android.gm”未经记录,如果软件包名称发生更改或未安装,则可能会出现错误。 - LocalPCGuy
@JaredBurrows,两者都是(但不是一般的编程),但我留下评论是因为你发表的第一条评论,为什么会得到负1分(我理解为踩)。我不会从任何地方复制/粘贴代码,除非我先亲自理解它,但你和我都知道这是个例外,如果检查空包是一个要求,那么应该在消息中说明(现在我看到已经有了,太好了!) - LocalPCGuy
8
java.lang.SecurityException: 权限拒绝:启动意图{ act=android.intent.action.VIEW dat=test@gmail.com cmp=com}。 - Irfan Raza
1
@IrfanRaza,你找到解决java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.VIEW dat=test@gmail.com cmp=com的方法了吗?如果是,请告诉我解决方案。 - Amit Jayaswal
显示剩余12条评论

42

我在我的应用程序中使用了这个:

Intent mailClient = new Intent(Intent.ACTION_VIEW);
mailClient.setClassName("com.google.android.gm", "com.google.android.gm.ConversationListActivity");
startActivity(mailClient);

36
这是未记录、不受支持的,并且很可能在将来出现故障。 - CommonsWare
5
针对API 17,我收到了一个 android.content.ActivityNotFoundException 错误:无法找到显式活动类 {com.google.android.gm/com.google.android.gm.ConversationListActivity},你已经在你的AndroidManifest.xml中声明了这个活动吗?你有什么想法吗? - Garret Wilson
1
调用 setPackage("com.google.android.gm") 方法,该方法自ICS版本以来可用,虽然未经记录,但很可能不会出现问题,因为包名可能不会更改。 - caw
3
现在它不起作用了... 可以使用以下代码:Intent intent = getPackageManager().getLaunchIntentForPackage("com.google.android.gm"); startActivity(intent); - Shivang
7
编写时(Gmail v6.7,Marshmallow),第二个参数(className)是"com.google.android.gm.ConversationListActivityGmail" - Quoting Eddie
显示剩余5条评论

23

使用包名作为方法不受推荐,因为这是一种未经记录的方式。如果某天包名更改了,代码将无法运行。

请尝试使用此代码替代

 Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts(
 "mailto", "abc@gmail.com", null));
 emailIntent.putExtra(Intent.EXTRA_SUBJECT, "This is my subject text");
 context.startActivity(Intent.createChooser(emailIntent, null));

参考: http://developer.android.com/reference/android/content/Intent.html#ACTION_SENDTO\


1
如果软件包名称在将来更改,使用try catch块可以防止崩溃。但是设置软件包名称可以提供更好的用户体验,因此对于Gmail,我们应该选择软件包。 - CopsOnRoad

21

使用这个:

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

这可能取决于设备和API级别,使用时请谨慎。


你能告诉我如何通过上述意图将电子邮件传递到Gmail搜索框吗? - Vatsal Dholakiya
很久没碰安卓了!我不确定。 - Richard Lalancette

17

简单可行,百分之百有效

Intent intent = new Intent (Intent.ACTION_SEND);
intent.setType("message/rfc822");
intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"anyMail@gmail.com"});
intent.putExtra(Intent.EXTRA_SUBJECT, "Any subject if you want");
intent.setPackage("com.google.android.gm");
if (intent.resolveActivity(getPackageManager())!=null)
    startActivity(intent);
else
    Toast.makeText(this,"Gmail App is not installed",Toast.LENGTH_SHORT).show();

12

后来的需求变成启动一个“电子邮件应用程序”,因此以下代码基本上启动了一个电子邮件应用程序,用户必须在显示出来的选项中进行选择。

因此,我不得不使用

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("plain/text");
intent.putExtra(Intent.EXTRA_SUBJECT, "Emailing link");
intent.putExtra(Intent.EXTRA_TEXT, "Link is \n" +
        "This is the body of hte message");
startActivity(Intent.createChooser(intent, ""));

如果你仔细看droid_fan的回答,那么它只会在特定设备上启动电子邮件应用程序,但我的回答无论平台如何都会启动电子邮件应用程序。 - Sana
重新审视后,也许Richard Lalancette的答案为使用未知启动意图细节启动包提供了更通用的解决方案。+1支持此观点。 - Moog
这也会在意图选择器中显示像PayPal之类的内容。可能不是您希望用户看到的。 - zyamys

12

试一试

我尝试了很多解决方案,但最终找到了一个适合我的正确方法。

try {
    Intent intent = new Intent (Intent.ACTION_VIEW , Uri.parse("mailto:" + "your_emailid@gmail.com"));
    intent.putExtra(Intent.EXTRA_SUBJECT, "your_subject");
    intent.putExtra(Intent.EXTRA_TEXT, "your_text");
    startActivity(intent);
} catch(Exception e) {
    Toast.makeText(Share.this, "Sorry...You don't have any mail app", Toast.LENGTH_SHORT).show();
    e.printStackTrace(); 
}

注意

  • 这将会打开你已安装的邮件应用程序(EmailGmail),在其中你可以选择其中一个发送邮件。
  • 不要使用直接的包名,例如("com.google.android.gm"),因为如果他们将来更改了包名,你的应用程序将会面临问题。

1
可以了,谢谢。不用再去尝试其他选项了,我很快就找到了这个。 - Diljeet

8
这个技巧适用于所有版本(API 3+),同时也适用于text/plain或者text/html(来源:sonida)。
Intent intent = new Intent(android.content.Intent.ACTION_SEND);
intent.setType("text/html");
// intent.setType("text/plain");
final PackageManager pm = getPackageManager();
final List<ResolveInfo> matches = pm.queryIntentActivities(intent, 0);
ResolveInfo best = null;
for (final ResolveInfo info : matches) {
    if (info.activityInfo.packageName.endsWith(".gm") || info.activityInfo.name.toLowerCase().contains("gmail")) {
        best = info;
        break;
    }
}
if (best != null) {
    intent.setClassName(best.activityInfo.packageName, best.activityInfo.name);
}
intent.putExtra(android.content.Intent.EXTRA_SUBJECT, "YOUR SUBJECT");
intent.putExtra(android.content.Intent.EXTRA_TEXT, Html.fromHtml("YOUR EXTRAS"));

startActivity(intent);

6

它有效。

Intent intent = new Intent(Intent.ACTION_SEND);

String[] strTo = { getString(R.string.mailto) };

intent.putExtra(Intent.EXTRA_EMAIL, strTo);
intent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.mail_subject));
intent.putExtra(Intent.EXTRA_TEXT, getString(R.string.mail_body));

Uri attachments = Uri.parse(image_path);
intent.putExtra(Intent.EXTRA_STREAM, attachments);

intent.setType("message/rfc822");

intent.setPackage("com.google.android.gm");

startActivity(intent);

3

最佳方法是使用通用的方式/方法:

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("plain/text");
intent.putExtra(Intent.EXTRA_SUBJECT, "Email Subject goes here");
intent.putExtra(Intent.EXTRA_TEXT, "Your Message goes here");
startActivity(Intent.createChooser(intent, ""));

这将给用户提供选择,他们可以选择GMail(如果已安装)或任何其他支持电子邮件的应用程序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接