Android:FileProvider IllegalArgumentException无法找到包含

时间:2018-03-20 15:02:19

标签: android

我正在尝试使用FileProvider使用intent打开图库中的图像。但我收到以下错误:

java.lang.IllegalArgumentException: Failed to find configured root that contains /data/data/com.example.diksha.chatapplication/app_photos/diksha.jpg

我尝试过其他类似问题提供的许多解决方案,但没有什么对我有用。

provider_path.xml

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

的AndroidManifest.xml

<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/provider_paths"/>
</provider>

Java代码

private Uri saveImage(Bitmap image){
        ContextWrapper cw = new ContextWrapper(getContext().getApplicationContext());
        File directory = cw.getDir("photos", Context.MODE_PRIVATE);
        File path = new File(directory, "diksha.jpg");
        FileOutputStream out = null;
        try{
            out = new FileOutputStream(path);
            image.compress(Bitmap.CompressFormat.JPEG, 100, out);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                out.close();
            }catch (IOException e){
                e.printStackTrace();
            }
        }
        return FileProvider.getUriForFile(getContext(),getContext().getPackageName() + ".fileprovider", path);
    }

MessageAdapter

public void onClick(View view) {
         Intent intent = new Intent();
         intent.setAction(Intent.ACTION_VIEW);
         intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
         intent.setDataAndType(message.getmImage(), "image/*");
         mContext.startActivity(intent);
}

1 个答案:

答案 0 :(得分:0)

替换:

ContextWrapper cw = new ContextWrapper(getContext().getApplicationContext());
File directory = cw.getDir("photos", Context.MODE_PRIVATE);

使用:

File directory = new File(getFilesDir(), "photos");

FileProvider不会使用getDir()创建的任意目录提供服务。不过,它会从getFilesDir()和子目录提供服务。

你很少应该创建一个ContextWrapper实例。