无法从FileProvider保存文件

时间:2018-03-10 15:19:37

标签: android android-6.0-marshmallow android-7.0-nougat

我正在使用Fileprovider从Android应用程序捕获图像并将图像保存在外部存储中。但它给了我一个例外,如下所示

java.lang.IllegalArgumentException: 
Failed to find configured root that contains /data/data/com.rocketstove/files/SAMS/JMC-R-1256655/application_form_first.jpg

我在androidManifest中配置了像这样的提供程序

<provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="${applicationId}.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />
</provider>

我还在file_paths

中添加了以下行
<?xml version="1.0" encoding="utf-8"?>
<paths>
  <external-path
    name="external_files"
    path="." />
</paths>

在java代码中

if (Build.VERSION.SDK_INT >= 23) {
        File imagePath = new File(getActivity().getFilesDir(), "SAMS");
        if (!imagePath.exists()) {
            imagePath.mkdir();
        }
        imagePath = new File(getActivity().getFilesDir() + "/SAMS", rocketId);
        if (!imagePath.exists()) {
            imagePath.mkdir();
        }
        File imageFile = new File(imagePath.getPath(), filename);
        intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        String authority = getActivity().getApplicationContext().getPackageName() + ".fileprovider";
        Uri uri = FileProvider.getUriForFile(getActivity(), authority, imageFile);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
        startActivity(intent);
}

修改 file_paths

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-files-path name="external_files" path="Android/data/com.rocketstove.files/"/>
</paths>

Java代码

if (Build.VERSION.SDK_INT >= 23) {
        File file
                 =getActivity().getExternalFilesDir(null);
        File imagePath = new File(file , rocketId);
        if (!imagePath.exists()) {
            imagePath.mkdir();
        }
        File imageFile = new File(imagePath.getPath(), filename);
        intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        String authority = getActivity().getApplicationContext().getPackageName() + ".fileprovider";
        Uri uri = FileProvider.getUriForFile(getActivity(), authority, imageFile);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
        startActivity(intent);
    }

错误

ava.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/Android/data/com.rocketstove/files/JMC-R-4555555/application_form_first.jpg
                  at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:719)
                  at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:404)

1 个答案:

答案 0 :(得分:2)

  

我还在file_paths

中添加了以下行

你有external-pathdocumentation表示:

  

表示外部存储区域根目录中的文件。此子目录的根路径与Environment.getExternalStorageDirectory()返回的值相同。

这不是您File指向的地方。

external-path更改为files-path,因为您的Java代码使用getFilesDir()

相关问题