java - Android - 无法使用 FileProvider 添加电子邮件附件

标签 java android android-intent email-attachments android-fileprovider

我正在尝试使用 FileProvider 将多个附件添加到电子邮件中,如 Android 文档 here 中所述。并找到了一个帖子here

问题是我不断收到来自 Gmail 的错误,指出“由于文件大小为零,无法附加一个或多个文件”,但我严格遵循了文档:

AndroidManifest:

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="com.collision.man.collisionman"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths">
     </meta-data>
</provider>

文件路径.xml:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="share" path="/" />
</paths>

SendActivity.java:

Intent sendIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);
//   sendIntent.setType("plain/text");
sendIntent.setType("image/*");
sendIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
sendIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
sendIntent.putExtra(Intent.EXTRA_EMAIL, new String[{"carl@collisionman.com"});
sendIntent.putExtra(Intent.EXTRA_SUBJECT, "CollisionMan Damage Estimate");
sendIntent.putExtra(Intent.EXTRA_TEXT, emailBody);

ArrayList<Uri> uriList = null;
try {
    uriList = getUriListForImages();
} catch (Exception e) {
    e.printStackTrace();
}
sendIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uriList);
Log.d("TAG", "Size of the ArrayList :: " + uriList.size());

SendActivity.this.startActivity(Intent.createChooser(sendIntent, "Email:"));

//}
}

private ArrayList<Uri> getUriListForImages() throws Exception {
    ArrayList<Uri> uriList = new ArrayList<Uri>();

    String imageDirectoryPath = getExternalStorageDirectory() + "/DirName";
    File imageDirectory = new File(Environment.getExternalStorageDirectory() + "/DirName");
    String[] fileList = imageDirectory.list();
    if (fileList.length != 0) {
        for (int i = 0; i < fileList.length; i++) {
            try {
                Uri u = FileProvider.getUriForFile(getApplicationContext(), "com.collision.man.collisionman", new File(imageDirectoryPath + fileList[i]));
                uriList.add(u);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    return uriList;
}

private File createImageFile() throws IOException {
    // Create an image file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageFileName = "JPEG_" + timeStamp + "_";

    //        File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES + picture_directory);
    File storageDir = new File(getExternalStorageDirectory() + "/DirName");
    if (!storageDir.exists()) {
        File imageDirectory = new File("/sdcard/DirName/");
        imageDirectory.mkdirs();
    }

    File image = File.createTempFile(
            imageFileName,  /* prefix */
            ".jpg",         /* suffix */
            storageDir      /* directory */
    );

    // Save a file: path for use with ACTION_VIEW intents
    mCurrentPhotoPath = image.getAbsolutePath();
    return image;
}

奇怪的是我的 uriList 包含我想要发送的文件的所有有效 URI 路径 - Gmail 根本不允许它们附加 - 所以我认为这是 FileProvider 的某种问题 - 但我真的不知道。

非常感谢任何建议。

最佳答案

当您真正想要 /sdcard/Dirname/Filename 时,imageDirectoryPath + fileList[i] 可能会创建一个类似 /sdcard/DirnameFilename 的字符串。

关于java - Android - 无法使用 FileProvider 添加电子邮件附件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45203703/

相关文章:

java - 防止关闭 xchart 图表时关闭整个 JVM

android - 当应用程序崩溃并且 logcat 没有显示错误时该怎么办

android - 如何通过c2dm通知将Android从 sleep 中唤醒并开始 Activity ?

android - MediaPlayer 在单独的线程中使用 Service 或 IntentService

android - 在 Native Extension 中创建的 Pending Intent 仅适用于 Notification,但不适用于 Service

java - 将 exec-maven-plugin 从 1.1.1 升级到 1.2 或 1.3.2

java - 暂停 kafka 在响应式(Reactive) Kafka 中读取

java - 如何同时瞄准朱诺号和开普勒号

android - 自 XS 6 以来不再调用 Xamarin.Android 应用程序

java - Android 应用许可致命异常 : Service Intent must be explicit