【问题标题】:Android: Email Intent ACTION_SENDTO doesn't work unless you add an intent filterAndroid:除非您添加意图过滤器,否则电子邮件意图 ACTION_SENDTO 不起作用
【发布时间】: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,则不会发生任何事情。

我做错了什么?

【问题讨论】:

  • 我建议删除 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


【解决方案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
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-06
  • 2015-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多