6

I want to send out an email from my app. So I used the following code.

String uriText = "abcd@gmail.com" + "?subject=" + URLEncoder.encode("Subject") + "&body=" + URLEncoder.encode("some text here");
Uri uri = Uri.parse(uriText);
Intent sendIntent = new Intent(Intent.ACTION_SENDTO);
sendIntent.setData(uri);
startActivity(Intent.createChooser(sendIntent, "Send Email"));

I have configured both my Gmail and EMail applications. I tested on my Nexus S (JellyBean) and HTC T-Mobile G2 (GingerBread). Both of them shows "No apps can perform this action.".

Does anyone have idea what's wrong here?

Karthik Andhamil
  • 848
  • 1
  • 13
  • 22

4 Answers4

12

If you are going to use ACTION_SENDTO, the Uri should use the mailto: or smsto: scheme. So, try mailto:abcd@gmail.com.

CommonsWare
  • 986,068
  • 189
  • 2,389
  • 2,491
  • @KarthikPalanivelu: I do not understand. If "the normal activity" is the chooser, that should go away on its own. If "the normal activity" is your activity, you can can `finish()` on it to make it go away. If "the normal activity" is something else, then there probably is nothing you can do about it. – CommonsWare Dec 21 '12 at 21:11
  • Am really sorry. It was a simple mistake on my side. I dint have a break statement where i had to. So, it executed the following code and another ACTION_SEND activity was launched. I noticed immediately so deleted the comment right away. Thanks for your reply :) – Karthik Andhamil Dec 21 '12 at 21:24
9

if you are using Intent.setData for sending email then change your code as:

String uriText = "mailto:someone@example.com" +
                 "?subject=" + URLEncoder.encode("Subject") + 
                 "&body=" + URLEncoder.encode("some text here");
Uri uri = Uri.parse(uriText);
Intent sendIntent = new Intent(Intent.ACTION_SENDTO);
sendIntent.setData(uri);
startActivity(Intent.createChooser(sendIntent, "Send Email"));
ρяσѕρєя K
  • 132,198
  • 53
  • 198
  • 213
1

Uri should be "mailto"

 Intent intent = new Intent(Intent.ACTION_SENDTO);  
 intent.setData(Uri.parse("mailto:"));  
 intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"abc@gmail.com"});  
 intent.putExtra(Intent.EXTRA_SUBJECT,"Order summary of Coffee");
 intent.putExtra(Intent.EXTRA_TEXT,BodyOfEmail);

 if(intent.resolveActivity(getPackageManager())!=null) {
            startActivity(intent);
        }
zeeshan ahmad
  • 71
  • 1
  • 2
-1

The following code worked for me and is a lot more reliable and flexible. Also, it's written in Kotlin :)

fun sendEmail(context: Context, mailTo: String? = null, subject: String? = null, bodyText: String? = null) {
    val emailIntent = Intent(Intent.ACTION_SENDTO)
    val uri = Uri.parse("mailto:${mailTo ?: ""}").buildUpon() // "mailto:" (even if empty) is required to open email composers
    subject?.let { uri.appendQueryParameter("subject", it) }
    bodyText?.let { uri.appendQueryParameter("body", it) }
    emailIntent.data = uri.build()
    try {
        context.startActivity(emailIntent)
    } catch (e: ActivityNotFoundException) {
        // Handle error properly
    }
}
Roger Oba
  • 1,292
  • 14
  • 28