如何在Android中添加多张图片作为邮件附件发送?
问题根因
ACTION_SEND仅支持单附件传输,多次调用intent.putExtra(Intent.EXTRA_STREAM, uri)会覆盖前一次赋值,这是系统Intent的既定规则。- 之前使用
ACTION_SEND_MULTIPLE失败,通常是两个原因导致:一是没有传入ArrayList<Uri>类型的附件集合,二是没有给目标邮件应用授予Uri读取权限,导致邮件应用无法访问当前应用缓存目录下的图片文件。
修复方案
直接修改shareImageandText方法即可,修改后代码如下:
private void shareImageandText(Bitmap bitmap, Bitmap bitmap2) { Uri uri = getmageToShare(bitmap); Uri uri2 = getmageToShare2(bitmap2); // 构造附件Uri集合 ArrayList<Uri> attachmentUris = new ArrayList<>(); if (uri != null) attachmentUris.add(uri); if (uri2 != null) attachmentUris.add(uri2); // 使用多内容发送Action Intent intent = new Intent(Intent.ACTION_SEND_MULTIPLE); // 传入附件集合 intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, attachmentUris); // 配置邮件内容 intent.putExtra(Intent.EXTRA_TEXT, "Sharing Image"); intent.putExtra(Intent.EXTRA_SUBJECT, "Subject Here"); // 设置MIME类型适配所有图片格式 intent.setType("image/*"); // 授予目标应用读取Uri的权限 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); startActivity(Intent.createChooser(intent, "Share Via")); }
额外优化建议
现有代码中getmageToShare和getmageToShare2逻辑完全重复,仅文件名不同,可以合并为一个通用方法减少冗余:
private Uri getImageToShare(Bitmap bitmap, String fileName) { File imageFolder = new File(getCacheDir(), "images"); Uri uri = null; try { imageFolder.mkdirs(); File file = new File(imageFolder, fileName); FileOutputStream outputStream = new FileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.PNG, 90, outputStream); outputStream.flush(); outputStream.close(); uri = FileProvider.getUriForFile(this, "com.example.myapplicationtest6.fileprovider", file); } catch (Exception e) { Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show(); } return uri; }
调用时传入对应文件名即可:
Uri uri = getImageToShare(bitmap, "shared_image.png"); Uri uri2 = getImageToShare(bitmap2, "shared_image2.png");
另外可以在分享前增加判空逻辑,避免未拍照就点击分享导致崩溃:
// 在share按钮的点击逻辑中增加判断 if (imageView.getDrawable() == null || imageView2.getDrawable() == null) { Toast.makeText(MainActivity.this, "请先拍摄两张照片", Toast.LENGTH_SHORT).show(); return; }
内容的提问来源于stack exchange,提问作者M21112
相关产品推荐
相关产品推荐

