在Android 7.0以后 为了进一步提高私有文件的安全性,Android不再由开发者放宽私有文件的访问权限,之前我们一直使用"file:///"绝对路径来传递文件地址的方式,在接收方访问时很容易触发SecurityException的异常。
因此,为了更好的适配Android 7.0,例如相机拍照这类涉及到文件地址传递的地方就用上了FileProvider,FileProvider也更好地进入了大家的视野。
其实FileProvider是ContentProvider的一个特殊子类,本质上还是基于ContentProvider的实现,FileProvider会把"file:///"的路径转换为特定的"content://"形式的content uri,接收方通过这个uri再使用ContentResolver去媒体库查询解析。
详细解决步骤如下:
public void playVideo(String path,String type){
Intent intent = new Intent(Intent.ACTION_VIEW);
File file = new File(path);//path为文件路径 type为 video/* ,audio/*,image/*
int flags = Intent.FLAG_GRANT_READ_URI_PERMISSION;
// Uri uri = Uri.fromFile(file);
Uri uri= FileProvider.getUriForFile(mContext, mContext.getApplicationContext().getPackageName() + ".fileProvider",file);
intent.setDataAndType(uri, type);
intent.setFlags(flags);
mContext.startActivity(intent);
}
- 在AndroidManifest.xml 配置 provider
```bash
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.xinrui.filemanager.fileProvider" //此次换成 包名 +.fileProvider
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>
3.在 res 下 新建xml 然后取名为filepaths.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<paths>
<root-path path="." name="ccb_xls" />//代表所有类型的路径
</paths>
</resources>
4. 这样配置就 完美解决了 FileProvider(Failed to find configured root that contains)