【问题标题】:Gmail doesn't open on the chooser menuGmail 未在选择器菜单上打开
【发布时间】:2020-03-16 05:14:57
【问题描述】:

我在我的应用上实现了这样的发送电子邮件功能:

val emailIntent = Intent(Intent.ACTION_SENDTO)
emailIntent.type = "message/rfc822"
emailIntent.putExtra(Intent.EXTRA_EMAIL, arrayOf("myId@gmail.com"))
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Hello~")
emailIntent.putExtra(Intent.EXTRA_TEXT, "$sendData")

try {
    startActivityForResult(Intent.createChooser(emailIntent, "Send mail..."), RESULT_SEND_EMAIL)
} catch (ex: ActivityNotFoundException) {
    Toast.makeText(this@MyActivity, "There are no email clients installed.", Toast.LENGTH_SHORT).show()
} catch (e : Exception){
    Toast.makeText(this@MyActivity, "${e.toString()}", Toast.LENGTH_SHORT).show()
}

从意图返回后,我使用startActivityForResult() 进行处理。

问题是 Gmail 应用无法在我同事的一台设备上打开。她用的是华为mate pro。它仍然显示在应用程序选择器菜单上。但是就是打不开。

这有什么问题?是我的问题、Gmail 问题还是设备问题?

【问题讨论】:

  • 使用startActivity() 代替startActivityForResult()
  • 有什么原因吗? @PratikButani 我想在结果之后调用一些函数。
  • @PratikButani 什么?这与stackoverflow.com/questions/3470042/… 不重复。
  • startActivityForResult() 与其他设备完全兼容。
  • 我都试过了,你所有的答案都不正确。它适用于startActivityForResult() 和输入message/rfc822。 @PratikButani

标签: android android-intent gmail


【解决方案1】:

我在the document找到了解决方案。

您需要使用mailto: 方案。这允许您打开电子邮件应用程序。换句话说,所有邮件应用程序都应该有意图过滤器和打开您的电子邮件应用程序的方案。如果不包含它,它将无法正常工作。

文档中的例子是最好的例子。

    fun composeEmail(addresses: Array<String>, subject: String, body: String) {
        val intent = Intent(Intent.ACTION_SENDTO).apply {
            data = Uri.parse("mailto:") // only email apps should handle this
            putExtra(Intent.EXTRA_EMAIL, addresses)
            putExtra(Intent.EXTRA_SUBJECT, subject)
            putExtra(Intent.EXTRA_TEXT, body)
        }

        if (intent.resolveActivity(packageManager) != null) {
            try {
                startActivity(Intent.createChooser(intent, "Send mail...")))
            } catch (ex: ActivityNotFoundException) {
                Toast.makeText(this@MainActivity, "There are no email clients installed.", Toast.LENGTH_SHORT).show()
            }
        }
    }

用法:

composeEmail(arrayOf("youremail@gmail.com", subject, body)

如果您想在关闭电子邮件应用程序后做一些工作,您可以使用startActivityForResult()。 (但是,由于 ACTION_SENDTO 和 ACTION_SEND 没有返回任何内容,因此您无法捕获发送成功与否的结果,这意味着它与 startActivity() 没有太大区别。

如果您想向多个人发送电子邮件。您必须在数组中添加更多人,这就是 composeEmail 方法采用数组的原因。 在这里,您可能想知道ACTION_SEND and ACTION_SENDTO 之间的区别。 ACTION_SEND 是带附件的,ACTION_SENDTO 是不带附件的。如果您想要多个附件,则必须使用 ACTION_SEND_MULIPLE。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-28
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多