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 appGmail

但是,我不希望我的应用成为此意图的接收者。我只希望 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 服务,否则不会运行

如何在android中使用意图过滤器获取数据

除非您更新 Google Play 服务错误,否则此应用将无法运行

除非您更新 Google Play 服务(通过 Bazaar),否则此应用将无法运行