在 Android 中发送电子邮件时在 StartActivity() 中使用 Intent.createChooser() 的目的是啥

Posted

技术标签:

【中文标题】在 Android 中发送电子邮件时在 StartActivity() 中使用 Intent.createChooser() 的目的是啥【英文标题】:What is the purpose of using Intent.createChooser() in StartActivity() while sending email in Android在 Android 中发送电子邮件时在 StartActivity() 中使用 Intent.createChooser() 的目的是什么 【发布时间】:2011-04-17 18:46:36 【问题描述】:

当我们需要在 android 中发送电子邮件时,我们将使用 Intent.ACTION_SEND 调用已注册的电子邮件应用程序,如下所示

Intent i = new Intent(Intent.ACTION_SEND);
startActivity(Intent.createChooser(i, "Send mail..."));

我的疑问是为什么我们需要在 startActivity 中使用 Intent.createChooser 而不是使用 startActivty(i)。 使用Intent.createChooser()有什么具体原因吗?

【问题讨论】:

【参考方案1】:

AFAIK,如果您使用Intent.createChooser,则存在三个不同之处:

    您可以指定选择器对话框的标题以使其更清晰。

    即使用户选择了默认对话框,系统也会始终显示选择器对话框。

    如果Intent.createChooser 创建的意图与任何活动都不匹配,系统仍会显示具有指定标题的对话框和错误消息No application can perform this action。或者对于正常意图,您可能会收到 Android 运行时错误:Caused by: android.content.ActivityNotFoundException: No Activity found to handle Intent

【讨论】:

这是关于第三点。只有当您使用普通意图而不是 Intent.createChooser 时才会出现 ActivityNotFoundException。这也是使用 Intent.createChooser 的另一个优势。您可以根据此更改第 3 点。 @Euporie 你知道如何清除用户选择的默认值吗? @PhaniRithvij 试试PackageManger.clearPackagePreferredActivities,但是这个方法只能清除app自己的首选设置。 我在这里***.com/q/59279969/8608146问了一个关于如何清除用户选择的选项的问题。【参考方案2】:

选择器使用户能够选择默认以外的另一个邮件应用程序。如果您使用普通的 gmail(私人)和电子邮件(工作相关)并且您想选择使用哪一个,它非常有用。

应始终使用...

【讨论】:

但是如果我的设备中只有一个邮件应用程序,除了mailApplication,消息应用程序也会弹出。那么如何限制只有一个应用程序,即只启动邮件应用程序以响应意图 @Android_programmer_camera:请允许用户通过他们希望的任何方式发送任何内容。为什么你觉得你需要限制用户的选择? 嘿,我没听明白。你能解释一下吗? CommonsWare 刚刚说过,你不应该过滤选项,你应该让用户决定他想开始什么。我强烈推荐这种方式!【参考方案3】:

很旧的消息,但对于遇到它的其他人,您可以将 Intent 上的类型设置为电子邮件的 mime 类型,这至少会将其限制为可以发送适当类型消息的应用程序:

Intent i = new Intent(Intent.ACTION_SEND); 
i.setType( "message/rfc822");
startActivity(Intent.createChooser(i, "Send mail..."));

使选择器对话框更加简洁。

【讨论】:

【参考方案4】:

如果您不使用createChooser(),系统仍会显示选择器对话框,除非用户已经表达了他们决定将哪个已安装程序用于给定任务(或者他们已经撤回之前的决定)。

如果您确实使用createChooser(),系统将始终显示对话框,即使已经表达了偏好。

因此,两者都是绝对正确的,您必须决定在任何给定情况下使用哪一个。您的里程可能会有所不同,但基本上,如果您提供文本、图像、视频或类似格式用于显示或编辑,您可能希望省略 createChooser() 以便用户已经喜欢的任何内容都可以立即开始。另一方面,如果您希望每次都共享您希望用户使用不同的已安装程序处理的内容(例如,发送电子邮件、Facebook、聊天等),您可能希望使用createChooser() 来让您的用户可以轻松地即时选择。

【讨论】:

【参考方案5】:

我个人使用:

try 
    startActivity(i);
 catch (ActivityNotFoundException e) 
    startActivity(Intent.createChooser(i, null));

因此,如果用户有默认值,它将使用默认值,如果没有应用程序,则会弹出“无应用程序”窗口。两人都很开心。

【讨论】:

所以你基本上是两次调用 startActivity 并使用选择器只显示一个错误。不要认为它是明智的【参考方案6】:

我建议查看 de.cketti.mailto:email-intent-builder 库,而不是使用 Android 框架提供的 API。 This article 解释了哪些问题以及您应该切换的原因。

【讨论】:

以上是关于在 Android 中发送电子邮件时在 StartActivity() 中使用 Intent.createChooser() 的目的是啥的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 应用中发送电子邮件? [复制]

如何在 Android 中发送电子邮件? [复制]

使用带有 smtp 但没有 SSL 的 JavaMail API 在 android 中发送电子邮件

检查在 CakePHP 中发送电子邮件是不是成功/失败?

如何在 VC++ 中发送电子邮件?

sh 在shell中发送电子邮件