android - 通过意图将多个附件(图像和 PDF)发送到 gmail
问题描述
我有一个文件选择器,它为我提供所选文件的 URI(可以是多个或单个),现在我想使用意图将这些选定的文件(图像和 pdf)发送到 gmail 应用程序。我尝试了所有可用的在线发送附件,但未能成功。请指导我完成这件事,已经卡在这里好几天了。
使用 EasyPermissions 请求运行时权限:
if (!EasyPermissions.hasPermissions(AddEventActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
EasyPermissions.requestPermissions(AddEventActivity.this, "Read External data",2, Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
文件选择器:
Intent chooseFile = new Intent();
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
chooseFile.setAction(Intent.ACTION_OPEN_DOCUMENT);
}
else {
chooseFile.setAction(Intent.ACTION_GET_CONTENT);
}
chooseFile.setType("*/*");
chooseFile.addCategory(Intent.CATEGORY_OPENABLE);
chooseFile.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
chooseFile = Intent.createChooser(chooseFile, "Choose a file");
startActivityForResult(chooseFile, PICKFILE_RESULT_CODE);
将返回的 URI 存储在 HashMap 中:uriMap
Gmail 意图
Intent emailSelectorIntent = new Intent(Intent.ACTION_SENDTO);
emailSelectorIntent.setData(Uri.parse("mailto:"));
Log.d("mailList", Arrays.toString(subarray));
final Intent emailIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);
emailIntent.putExtra(Intent.EXTRA_EMAIL, subarray);
emailIntent.putExtra(Intent.EXTRA_SUBJECT,(CharSequence) eventName.getText().toString());
ArrayList<String> bodyList = new ArrayList<>();
String body = eventDesc.getText().toString() + " at " + eventVenue.getText().toString() + ", " + hourSelect + ":" + minuteSelect;
bodyList.add(body);
emailIntent.putExtra(Intent.EXTRA_TEXT, bodyList);
emailIntent.setSelector(emailSelectorIntent);
emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
emailIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
ArrayList<Uri> uris = new ArrayList<Uri>();
Iterator iterator = uriMap.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry mapElement = (Map.Entry) iterator.next();
uris.add((Uri) mapElement.getValue());
}
if (uris.size() != 0)
emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
startActivity(Intent.createChooser(emailIntent, "Choose an email application..."));
OnActivityResult 代码
如果选择了多个文件
for (int i = 0; i < data.getClipData().getItemCount(); i++) {
Uri uri = data.getClipData().getItemAt(i).getUri();}
否则,如果选择了单个文件
Uri uri;
uri = data.getData();
LogCat 错误
2020-08-01 16:56:16.414 30575-30575/? E/Gmail: ComposeActivity:Error adding attachment
gon: SecurityException when openAssetFileDescriptor.
at goo.a(PG:5)
at goo.a(PG:45)
at dvt.a(PG:137)
at duz.run(PG:2)
at dvt.a(PG:176)
at dvt.a(PG:144)
at dvt.a(PG:443)
at drq.a(Unknown Source:24)
at bbkz.a(Unknown Source:19)
at bdvu.a(Unknown Source:2)
at bdvw.run(PG:9)
at bdzb.run(Unknown Source:7)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:462)
at bbja.run(PG:2)
at aqsr.run(Unknown Source:18)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7397)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:935)
帮助表示赞赏。
提前致谢。
解决方案
文件选择器代码:
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("*/*");
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE,true);
startActivityForResult(Intent.createChooser(intent, "ChooseFile"), PICKFILE_RESULT_CODE);
意图代码:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND_MULTIPLE);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(Intent.EXTRA_EMAIL, subarray);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setType("vnd.android.cursor.dir/email");
ArrayList<Uri> uris=new ArrayList<Uri>();
if (uriMap.size()!=0) {
Iterator i= uriMap.entrySet().iterator();
while(i.hasNext()){
Map.Entry mapElement = (Map.Entry) i.next();
uris.add((Uri)mapElement.getValue());
}
intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM,uris);
}
intent.setPackage("com.google.android.gm");
startActivityForResult(intent, 101);
使用intent.setType()
并intent.setPackage()
为我工作!
推荐阅读
- javascript - 在 JSP 中看不到 Json 数据结果
- c++ - 从 .tsv 文件读入
- node.js - 从 Angular 和 Nodejs 请求 API 时出错
- python - 从python中的多行Excel工作表生成项目和子项目字段
- javascript - 为什么将 console.log() 放置在呈现视图的函数中时会重复打印一个变量?
- c# - 使用 JSON JavaScriptSerializer 在序列化或反序列化期间出现错误
- reactjs - React js CRUD - 添加数据时如何自动更新表而不刷新
- javascript - 在时间段之间获得整个三个月
- javascript - 无法在 jQuery / Ajax 中使用附加成功函数
- python - 捕获 Firebase 504 网关超时