如何捕获图像并将其Uri通过电子邮件直接发送到附件

时间:2019-04-21 15:12:40

标签: java android kotlin

我有Ui,必须在其中捕获图像并将onActivityResult直接发送到电子邮件中,因为我已经尝试了所有可能的解决方案,但是每次都失败,并且它给我附上错误,经过长时间的搜索和实施,我发现有一些要检查的内容,如果我可以读取文件还是不像file.canRead()这样,它总是给我错误。任何解决方案将不胜感激。

private fun sendEmail(liscence: String, desc: String) {
val emailIntent = Intent(Intent.ACTION_SEND)
val to = arrayOf("info@gmail.com")
emailIntent.putExtra(Intent.EXTRA_EMAIL, to)

    emailIntent.type = "text/plain";
    emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)

    // attachment Uri comes through camera
    emailIntent.putExtra(Intent.EXTRA_STREAM, imagePath)
    // the mail subject
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Report")
    //email body
    val body = "${liscence} \n ${desc}"
    emailIntent.putExtra(Intent.EXTRA_TEXT, body)
    //need this to prompts email client only
    emailIntent.type = "message/rfc822";
    startActivity(Intent.createChooser(emailIntent, "Send email using..."))
}

2 个答案:

答案 0 :(得分:1)

这里经过大量研究,我在Android文档中找到了解决方案

https://developer.android.com/reference/android/support/v4/content/FileProvider.html#GetUri

这是我最后的代码,用于将捕获的图像共享到Gmail。 这段代码将直接转到Manifest文件,您必须使用权限作为有效的权限提供者。

 <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="${applicationId}.com.mydomain.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true"
        tools:replace="android:authorities">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/picker_provider_paths" />
    </provider>

提供者的XML文件:

<?xml version="1.0" encoding="utf-8"?>
<paths>
<files-path name="image_picked" path="picked/"/>
<external-path name="*" path="Pictures/"/>
</paths>

将SendImage作为附件的功能。

    private fun sendEmail() {
    val contentUri = 
    FileProvider.getUriForFile(context!!,
            "yourPackageAndThen.com.mydomain.fileprovider", 
    File(PATH OF IMAGE or FILE ));

    val emailIntent = Intent(Intent.ACTION_SEND)

    //need this to prompts email client only
    emailIntent.type = "message/rfc822";
    val to = arrayOf("EMAIL ID TO SEND")
    emailIntent.putExtra(Intent.EXTRA_EMAIL, to)
    emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
    emailIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)

    // attachment Uri comes through camera
    emailIntent.putExtra(Intent.EXTRA_STREAM, contentUri)

    // the mail subject
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Report")
    //email body
    emailIntent.putExtra(Intent.EXTRA_TEXT, MESSAGEforBody)
    startActivity(Intent.createChooser(emailIntent, "Send email using..."))

}

答案 1 :(得分:0)

您是否向应用程序添加了READ_EXTERNAL_STORAGE权限,并向Android SDK中大于23的用户要求此权限? 另外,如果您将附件另存为私人文件,则邮件将无法读取。 link对此进行了详细说明。