androidsendto

Sending email with attachment using SENDTO on some devices doesn't work


At first you're going to think "Wait, this question is a duplicate!". Read on.

I'm trying to use the Intent ACTION_SENDTO (with an Email URI as data) in order to have just email apps respond.

(Using ACTION_SEND launches a standard "SEND" chooser with no data URI meaning that non email apps, such as Google Drive, also respond).

My problem is that the attachment works with ACTION_SEND on all devices, however - when using ACTION_SENDTO only some devices correctly attach the files. Nexus 7 works but Samsung Galaxy Tab and Acer Iconia don't.

You can see below the different methods side by side:

    String email    = getActivity().getResources().getString(R.string.supportEmail);
    String subject  = getActivity().getResources().getString(R.string.sFeedback);
    subject         = String.format(subject, 
                      getActivity().getResources().getString(R.string.productName));
    String content  = getActivity().getResources().getString(R.string.whatFeedbackWouldYouLikeToProvide) + "\n\n" + 
                      mMessage.getText().toString();
    File toSend     = new File(outfile);

    if(toSend.exists()) {
        Log.e("Feedback", "File path: " + toSend.getAbsolutePath());

        Intent emailIntent = new Intent(android.content.Intent.ACTION_SENDTO);
        emailIntent.setData(Uri.parse("mailto:" +email));
        emailIntent.putExtra(android.content.Intent.EXTRA_STREAM,   Uri.fromFile(toSend));
        emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,  subject);               
        emailIntent.putExtra(android.content.Intent.EXTRA_TEXT,     content);  

    /*  Intent emailIntent = new Intent(Intent.ACTION_SEND);
        emailIntent.setType("message/rfc822");
        emailIntent.putExtra(Intent.EXTRA_EMAIL  , new String[]{email});
        emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
        emailIntent.putExtra(Intent.EXTRA_TEXT   , content);
        emailIntent.putExtra(Intent.EXTRA_STREAM , Uri.fromFile(toSend)); */

        try {
            startActivity(emailIntent);
        } catch (ActivityNotFoundException anfe) {
            Toast.makeText(getActivity(), getResources().getString(R.string.pleaseInstallAnEmailClientInOrderToSendUsFeedback), 8000).show();
        }
    }

You can see that the filepaths don't seem to be the problem, I've added in some logging which reports:

Samsung Gives:

04-11 11:40:09.953: E/Feedback(6286): File path: /storage/sdcard0/logs.zip

Nexus Gives:

04-11 11:38:59.249: E/Feedback(12702): File path: /storage/emulated/0/logs.zip

(Both based on getExternalStorageDirectory() to ensure cross application access).

Does anybody know why the difference?


Solution

  • Try to resolve activity via ACTION_SENDTO, but actually sending via ACTION_SEND.

    Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts(
                        "mailto", "", null));
                intent.putExtra(Intent.EXTRA_SUBJECT, title);
                intent.putExtra(Intent.EXTRA_TEXT, text);
                intent.putExtra(Intent.EXTRA_STREAM, getSnapshotUri(snapshot, context, event));
    
                List<ResolveInfo> resolveInfos = context.getPackageManager().queryIntentActivities(intent, 0);
                if (resolveInfos.size() == 0) {
                    new AlertDialog.Builder(context)
                            .setMessage(R.string.no_mail_app)
                            .setPositiveButton(R.string.ok, null)
                            .show();
                } else {
                    String packageName = resolveInfos.get(0).activityInfo.packageName;
                    String name = resolveInfos.get(0).activityInfo.name;
    
                    intent.setAction(Intent.ACTION_SEND);
                    intent.setComponent(new ComponentName(packageName, name));
    
                    context.startActivity(intent);
                }