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

android, sendto

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);
            }

Problem

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?

Original source

Related problems