Android:除非您添加意图过滤器,否则电子邮件意图 ACTION_SENDTO 不起作用
Posted
技术标签:
【中文标题】Android:除非您添加意图过滤器,否则电子邮件意图 ACTION_SENDTO 不起作用【英文标题】:Android: Email Intent ACTION_SENDTO doesn't work unless you add an intent filter 【发布时间】: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
,则不会发生任何事情。
我做错了什么?
【问题讨论】:
***.com/q/62535856 我建议删除resolveActivity()
调用并将其替换为 try
/catch
周围的 startActivity()
调用。无论如何,您都需要try
/catch
,因为从另一个应用程序启动活动时可能会出现其他问题。另请注意,ACTION_SENDTO
没有记录这些额外内容,因此并非每个应用都会尊重它们。
@CommonsWare 你是对的,通过删除resolveActivity()
问题就消失了。但是我想知道为什么Android官方文档说要使用它:developer.android.com/guide/components/intents-common#Email
在 Android 11 之前,resolveActivity()
不是问题。发布 Android 11 时,该特定文档页面未更新。
【参考方案1】:
您可以尝试以下方法吗?这就是我使用的。据我所知,您的代码很好,并且选择器的东西不应该影响我的感觉,但我仍然建议尝试以下一次。我觉得可能是导致问题的选择器。
public void composeEmail(String[] addresses, String subject)
Intent sendIntent = new Intent(Intent.ACTION_SENDTO);
sendIntent.setData(Uri.parse("mailto:")); // only email apps should handle this
sendIntent.putExtra(Intent.EXTRA_EMAIL, addresses);
sendIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
Intent shareIntent = Intent.createChooser(sendIntent, null);
startActivity(shareIntent);
【讨论】:
看来我什至不需要Intent.createChooser
行。正如@CommonsWare 在他的评论中建议的那样,我可以将try
/catch
放在startActivity
周围
是的,这也是一种方式。虽然我建议您使用选择器,但如果没有匹配的应用程序并且公共共享表将处理它,您也可以向它提供消息。 @DanieleB以上是关于Android:除非您添加意图过滤器,否则电子邮件意图 ACTION_SENDTO 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
使用 Google Maps API android studio “除非您更新 Google Play 服务,否则应用程序将无法运行”
Android - 在更新 SDK 版本 23 后添加至少一个带有 ACTION-VIEW 意图过滤器的 Activity
Google 地图活动 - 除非您更新 Google Play 服务,否则不会运行