Android Studio mailto Intent doesn't show subject and mail body

前端 未结 5 1729
無奈伤痛
無奈伤痛 2020-12-11 02:45

I\'m trying to send an e-mail from my Android App. With the click on a button, gmail should open and show a new email with my previously defined recipient, subject and email

相关标签:
5条回答
  • 2020-12-11 03:10

    try out this code, it worked for me.

    Intent intent = new Intent(Intent.ACTION_SENDTO);
                intent.setData(Uri.parse("mailto:")); // only email apps should handle this
                intent.putExtra(Intent.EXTRA_EMAIL, new String[]{email});
                intent.putExtra(Intent.EXTRA_SUBJECT, "Subject here");
                intent.putExtra(Intent.EXTRA_TEXT,"Body Here");
                if (intent.resolveActivity(getPackageManager()) != null) {
                    startActivity(intent);
                }
    

    also add intent filter in android manifest.

    <activity ...>
    <intent-filter>
        <action android:name="android.intent.action.SENDTO" />
        <data android:scheme="mailto" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
    

    0 讨论(0)
  • 2020-12-11 03:20

    In order to get it to work on Samsung and Pixel devices, we had to add the parameters on both the url and the extras

    val email = "xxxx@xxxx.com"
    val subject = "xxxx"
    val body = "xxxx"
    
    val selectorIntent = Intent(Intent.ACTION_SENDTO)
    val urlString = "mailto:" + Uri.encode(email) + "?subject=" + Uri.encode(subject) + "&body=" + Uri.encode(body)
    selectorIntent.data = Uri.parse(urlString)
    
    val emailIntent = Intent(Intent.ACTION_SEND)
    emailIntent.putExtra(Intent.EXTRA_EMAIL, arrayOf(email))
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject)
    emailIntent.putExtra(Intent.EXTRA_TEXT, body)
    emailIntent.selector = selectorIntent
    
    startActivity(Intent.createChooser(emailIntent, "Send email"))
    
    0 讨论(0)
  • 2020-12-11 03:30

    I think we had the same issue. Android API 29 introduced some improvements about sending data to other apps. See more details here: Sending simple data to other apps

    Here is the solution that works for me.

    Intent selectorIntent = new Intent(Intent.ACTION_SENDTO);
    selectorIntent.setData(Uri.parse("mailto:"));
    
    final Intent emailIntent = new Intent(Intent.ACTION_SEND);
    emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{"address@mail.com"});
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, "The subject");
    emailIntent.putExtra(Intent.EXTRA_TEXT, "The email body");
    emailIntent.setSelector( selectorIntent );
    
    activity.startActivity(Intent.createChooser(emailIntent, "Send email..."));
    

    In few words, with this you are asking for the Android standard app chooser and, in addition, you specify that you want to send an email. So, as result, email clients will appear only. If user has one email client installed only, the intent will redirect to it instantly.

    Hope this helps you too.

    0 讨论(0)
  • 2020-12-11 03:30

    Our old code for emails stopped working some days ago.

    It was the following:

    public static void shareTextToEmail(Context context, String[] email, String subject, String text)
        Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:" + TextUtils.join(",", email)));
        emailIntent.putExtra(Intent.EXTRA_EMAIL, email);
        emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
        emailIntent.putExtra(Intent.EXTRA_TEXT, text);
        try {
            context.startActivity(Intent.createChooser(emailIntent, context.getString(R.string.share_email_title)));
        } catch (android.content.ActivityNotFoundException e) {
            Toast.makeText(context, context.getString(R.string.share_no_intent_handler_found), Toast.LENGTH_SHORT).show();
        }
    }
    

    I've adopted it according to the Zak.Antonio answer:

    public static void shareTextToEmail(Context context, String[] email, String subject, String text)
        Intent selectorIntent = new Intent(Intent.ACTION_SENDTO);
        selectorIntent.setData(Uri.parse("mailto:"));
    
        final Intent emailIntent = new Intent(Intent.ACTION_SEND);
        emailIntent.putExtra(Intent.EXTRA_EMAIL, email);
        emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
        emailIntent.putExtra(Intent.EXTRA_TEXT, text);
        emailIntent.setSelector(selectorIntent);
    
        try {
            context.startActivity(Intent.createChooser(emailIntent, context.getString(R.string.share_email_title)));
        } catch (android.content.ActivityNotFoundException e) {
            Toast.makeText(context, context.getString(R.string.share_no_intent_handler_found), Toast.LENGTH_SHORT).show();
        }
    }
    

    The key points are:

    • Replace Intent.ACTION_SENDTO with Intent.ACTION_SEND in emailIntent
    • Move Intent.ACTION_SENDTO to a selectorIntent
    • Do not put emails in intent data, put them only in extras at Intent.EXTRA_EMAIL
    0 讨论(0)
  • 2020-12-11 03:33

    try this code

        val emailIntent = Intent(Intent.ACTION_SEND)
        emailIntent.setType("text/plain")
        emailIntent.putExtra(Intent.EXTRA_EMAIL, arrayOf("jon@example.com")) 
        emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Email subject")
        emailIntent.putExtra(Intent.EXTRA_TEXT, "Email message text")
        val packageManager = packageManager
        val activities = packageManager.queryIntentActivities(emailIntent, 0)
        val isIntentSafe = activities.size > 0
        if (isIntentSafe) {
            startActivity(emailIntent);
        }else{
            Log.d("MainActivty","Email App not installed");
        }
    
    0 讨论(0)
提交回复
热议问题