起初你会想到"等等,这个问题是重复的!".继续阅读.
我正在尝试使用Intent ACTION_SENDTO(使用电子邮件URI作为数据),以便只有电子邮件应用程序响应.
(使用ACTION_SEND启动标准"SEND"选择器而没有数据URI意味着非电子邮件应用程序(如Google Drive)也会响应).
我的问题是附件适用ACTION_SEND于所有设备,但是 - 当ACTION_SENDTO只使用某些设备正确附加文件时.Nexus 7可以使用,但三星Galaxy Tab和Acer Iconia 没有.
您可以在下面看到不同的方法:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
您可以看到文件路径似乎不是问题,我在一些报告中添加了报告:
三星给予:
04-11 11:40:09.953: E/Feedback(6286): File path: /storage/sdcard0/logs.zip
Run Code Online (Sandbox Code Playgroud)
Nexus给予:
04-11 11:38:59.249: E/Feedback(12702): File path: /storage/emulated/0/logs.zip
Run Code Online (Sandbox Code Playgroud)
(两者都基于getExternalStorageDirectory()确保跨应用程序访问).
有人知道为什么会有区别吗?
小智 15
我想出的唯一解决方案是以下方案.它是我在寻找完整答案时找到的其他一些东西的混合物.以下内容仅显示电子邮件应用,并允许包含附件.最重要的部分在这里找到:https://stackoverflow.com/a/8550043/4927659
ArrayList<Uri> uris = new ArrayList<>();
uris.add(Uri.parse("file://" + filepath));
//filepath is something like that: /mnt/sdcard/DCIM/DSC0001.JPG
Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts(
"mailto", "example@gmail.com", null));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Mail subject");
List<ResolveInfo> resolveInfos = getPackageManager().queryIntentActivities(emailIntent, 0);
List<LabeledIntent> intents = new ArrayList<>();
for (ResolveInfo info : resolveInfos) {
Intent intent = new Intent(Intent.ACTION_SEND_MULTIPLE);
intent.setComponent(new ComponentName(info.activityInfo.packageName, info.activityInfo.name));
intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"example@gmail.com"});
intent.putExtra(Intent.EXTRA_SUBJECT, "Mail subject");
intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); //ArrayList<Uri> of attachment Uri's
intents.add(new LabeledIntent(intent, info.activityInfo.packageName, info.loadLabel(getPackageManager()), info.icon));
}
Intent chooser = Intent.createChooser(intents.remove(intents.size() - 1), "Send email with attachments...");
chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intents.toArray(new LabeledIntent[intents.size()]));
startActivity(chooser);
Run Code Online (Sandbox Code Playgroud)
小智 5
尝试通过 ACTION_SENDTO 解决活动,但实际上是通过 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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5333 次 |
| 最近记录: |