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