如何启动预填充“收件人”字段的电子邮件应用程序?

17

我尝试了在这里找到的代码:

Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto", "testemail@gmail.com", null)); startActivity(intent);

但我在屏幕上收到一条消息,上面写着“不支持的操作”。有什么办法可以让它正常工作吗?

4个回答

29

尝试使用dylan提供的代码片段

/* Create the Intent */
final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);

/* Fill it with Data */
emailIntent.setType("plain/text");
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{"to@email.com"});
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Subject");
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Text");

/* Send it off to the Activity-Chooser */
context.startActivity(Intent.createChooser(emailIntent, "Send mail..."));

关键点:使用EXTRA_EMAIL来设置你的电子邮件地址,并在用户配置了多个电子邮件客户端时使用createChooser()


3
谢谢,那个方法管用 :) 我之前试过类似的方法,但它只是弹出了一些消息屏幕而不是电子邮件应用程序。我想那是因为当时在模拟器中没有设置电子邮件帐户吗? - scuba
你为什么使用了final关键字?这会导致我不知道的某种优化吗? - Scott
我没有写这段代码片段。个人而言,我可能不会在那里使用final关键字。 - CommonsWare
原作者可能在某个监听器中使用了最终的emailIntent变量,但最终改变了方法并忘记删除final关键字?不管怎样,这只是我的猜测。 :) - pm_labs
它说“没有应用程序可以执行该操作” - IntoTheDeep

5

你尝试过了吗?

Intent intent = new Intent(
    Intent.ACTION_SENDTO,
    Uri.parse("mailto:testemail@gmail.com")
);
startActivity(intent);

尝试了一下,仍然收到以下消息:不支持的操作 当前不支持此操作。以 Toast 类似的气泡形式显示。我需要在清单文件中设置什么才能让我的应用程序使用它吗? - scuba

1
我认为真正的问题在于你正在使用官方模拟器,并且你的意图与任何东西都不匹配。
经过我的测试,当意图的URI(来自setData())没有匹配任何内容,并且你正在运行其中一个官方Android模拟器时,会出现这个问题。这似乎不会发生在实际设备上,因此不应该是一个现实世界中的问题。
你可以使用这段代码在启动意图之前检测是否会出现这种情况:
ComponentName emailApp = intent.resolveActivity(getPackageManager());
ComponentName unsupportedAction = ComponentName.unflattenFromString("com.android.fallback/.Fallback");
boolean hasEmailApp = emailApp != null && !emailApp.equals(unsupportedAction);

(显示“不支持的操作”操作方法的活动名称为com.android.fallback.FallbackActivity。)

1

如果您使用Kotlin,请使用此扩展。

fun Context.sendEmailTo(email:String){
Intent(Intent.ACTION_SENDTO).apply {
    data = Uri.parse("mailto:$email")
    startActivity(this)
}

}


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