做商业项目的时候,应用往往需要提供一些用户的反馈渠道,尽管现在有微信公众号、微博等等方便快捷的途径可以与应用开发者取得联系,但邮箱也是不可或缺的一种反馈途径。
在应用开发中,我们时常会拉起邮箱应用来完成发送邮件的操作,同时还会自动帮用户填写部分信息,减少用户的操作步骤,今天就教大家在 Android 开发中如何实现这一操作。
前提是手机需要安装并登录邮箱客户端,你可以使用一些邮箱服务商提供的官方应用,比如『Gmail』、『QQMail』等等,也可以使用手机内置的邮箱应用,具体配置操作可参考『用好手机系统自带的邮件客户端』。
最简单的场景,我们只需要给指定的官方邮箱发送一些文本内容,可以这么写:
object EmailSender {
fun mailToOne(context: Context) {
val intent = Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:foo@bar.com"))
intent.putExtra(Intent.EXTRA_SUBJECT, "这是主题")
intent.putExtra(Intent.EXTRA_TEXT, "这是内容")
context.startActivity(intent);
}
}
这里用到了 Activity 的隐式启动,首先需要把 Intent 的 action 设置为 Intent.ACTION_SENDTO,再将 data 设置为 mailto: 开头的 Uri,并在后面拼接邮箱地址,这样就只有邮箱应用才能够响应我们的 Intent。如果需要设置主题和内容,可以填充 Intent.EXTRA_SUBJECT 和 Intent.EXTRA_TEXT 这两个字段。
效果如下:

邮件不仅支持发送给单一收件人,我们可以指定多个收件人,还支持抄送、密送。
object EmailSender {
fun mailToMultiple(context: Context) {
val intent = Intent(Intent.ACTION_SENDTO)
intent.setData(Uri.parse("mailto:"))
intent.putExtra(Intent.EXTRA_EMAIL, arrayOf("foo@bar.com", "bar@foo.com"))
intent.putExtra(Intent.EXTRA_CC, arrayOf("cc@bar.com")) // 抄送
intent.putExtra(Intent.EXTRA_BCC, arrayOf("bcc@bar.com")) // 密送
intent.putExtra(Intent.EXTRA_SUBJECT, "这是主题")
intent.putExtra(Intent.EXTRA_TEXT, "这是内容")
context.startActivity(intent)
}
}
action 的配置与上文一致,但是 data 不需要拼接收件人的邮箱地址,而是改成在 Intent.EXTRA_EMAIL 字段传入,抄送和密送的邮箱地址则分别在 Intent.EXTRA_CC 和 Intent.EXTRA_BCC 字段传入,这三个字段都接收字符串类型的数组,也就意味着我们可以填充多个邮箱地址。
效果如下:

邮件同时还能上传附件,我们可以这么写:
object EmailSender {
fun mailAttachments(context: Context) {
val file = File(PathUtils.getInternalAppFilesPath(), "screenshot.png")
val intent = Intent(Intent.ACTION_SEND_MULTIPLE)
intent.selector = Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:"))
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
intent.putExtra(Intent.EXTRA_EMAIL, arrayOf("foo@bar.com"))
intent.putExtra(Intent.EXTRA_SUBJECT, "这是主题")
intent.putExtra(Intent.EXTRA_STREAM, arrayListOf(UriUtils.file2Uri(file)))
context.startActivity(intent)
}
}
这里将 action 改成 Intent.ACTION_SEND_MULTIPLE,如果仅仅是这样修改,除了邮箱应用外,许多应用都能够响应我们的 Intent,因此还需要调用 setSelector() 方法,为此 Intent 设置选择器。最后再向 Intent.EXTRA_STREAM 字段传入附件的 Uri,它也接收数组,意味着我们可以传输多个附件。
效果如下:

