【发布时间】:2021-09-08 05:11:17
【问题描述】:
我想用预先格式化的电子邮件打开 Gmail。 我正在使用此代码:
public static void sendEmail(Context context, String receiverAddress, String title, String body) {
Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
emailIntent.setData(Uri.parse("mailto:"));
emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] { receiverAddress });
emailIntent.putExtra(Intent.EXTRA_SUBJECT, title);
if (body != null) {
emailIntent.putExtra(Intent.EXTRA_TEXT, body);
}
if (emailIntent.resolveActivity(context.getPackageManager()) != null) {
context.startActivity(emailIntent);
}
}
但是,只有在我将 intent-filter 添加到我的应用程序的清单文件时它才有效:
<intent-filter>
<action android:name="android.intent.action.SENDTO" />
<data android:scheme="mailto" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
通过这样做,它向我显示了一个包含两个应用程序的应用程序选择器:my app 和 Gmail。
但是,我不希望我的应用成为此意图的接收者。我只希望 Gmail(和其他电子邮件客户端)收到此意图。
但如果我不添加 intent-filter,则不会发生任何事情。
我做错了什么?
【问题讨论】:
-
我建议删除
resolveActivity()调用并将其替换为try/catch周围的startActivity()调用。无论如何,您都需要try/catch,因为从另一个应用程序启动活动时可能会出现其他问题。另请注意,ACTION_SENDTO没有记录这些额外内容,因此并非每个应用都会尊重它们。 -
@CommonsWare 你是对的,通过删除
resolveActivity()问题就消失了。但是我想知道为什么Android官方文档说要使用它:developer.android.com/guide/components/intents-common#Email -
在 Android 11 之前,
resolveActivity()不是问题。发布 Android 11 时,该特定文档页面未更新。
标签: android email android-intent gmail intentfilter