Send Email Intent

前端 未结 30 3626
忘掉有多难
忘掉有多难 2020-11-22 07:27
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType(\"text/html\");
intent.putExtra(Intent.EXTRA_EMAIL, \"emailaddress@emailaddress.com\");
intent.putExtr         


        
30条回答
  •  执念已碎
    2020-11-22 07:50

    Most of these answers work only for a simple case when you are not sending attachment. In my case I need sometimes to send attachment (ACTION_SEND) or two attachments (ACTION_SEND_MULTIPLE).

    So I took best approaches from this thread and combined them. It's using support library's ShareCompat.IntentBuilder but I show only apps which match the ACTION_SENDTO with "mailto:" uri. This way I get only list of email apps with attachment support:

    fun Activity.sendEmail(recipients: List, subject: String, file: Uri, text: String? = null, secondFile: Uri? = null) {
        val originalIntent = createEmailShareIntent(recipients, subject, file, text, secondFile)
        val emailFilterIntent = Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:"))
        val originalIntentResults = packageManager.queryIntentActivities(originalIntent, 0)
        val emailFilterIntentResults = packageManager.queryIntentActivities(emailFilterIntent, 0)
        val targetedIntents = originalIntentResults
                .filter { originalResult -> emailFilterIntentResults.any { originalResult.activityInfo.packageName == it.activityInfo.packageName } }
                .map {
                    createEmailShareIntent(recipients, subject, file, text, secondFile).apply { `package` = it.activityInfo.packageName }
                }
                .toMutableList()
        val finalIntent = Intent.createChooser(targetedIntents.removeAt(0), R.string.choose_email_app.toText())
        finalIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedIntents.toTypedArray())
        startActivity(finalIntent)
    }
    
    private fun Activity.createEmailShareIntent(recipients: List, subject: String, file: Uri, text: String? = null, secondFile: Uri? = null): Intent {
        val builder = ShareCompat.IntentBuilder.from(this)
                .setType("message/rfc822")
                .setEmailTo(recipients.toTypedArray())
                .setStream(file)
                .setSubject(subject)
        if (secondFile != null) {
            builder.addStream(secondFile)
        }
        if (text != null) {
            builder.setText(text)
        }
        return builder.intent
    }
    

提交回复
热议问题