简介:
Android7.0修改了文件权限,导致访问内部文件通过Uri.fromFile(file)构建URI,然后Intent启动意图的方式将不再适用。原因是这种方式构建的uri不够安全。官方建议通过FileProvider,通过文件共享的方式构建URI。
可参考文章快速引入FileProvider
遇到的问题:
- Failed to find configured root that:
构建URI时就出现了错误,配置的Filepath和文件路径不匹配,匹配即可,也可以使用相对路径:
<external-path name="mintu" path="./" />
- 打开附件时,提示文件名不存在,但是确定文件是存在的
构建uri时会要求传入文件作为参数,这里可以判断自己的文件是否存在,当确定存在时提示文件名不存在。可以通过配置Inten解决。添加Intent代码:
intent.putExtra(MediaStore.EXTRA_OUTPUT,uri);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
核心代码
//AndroidManifest.xml
<provider
android:authorities="com.mintu.dcdb.fileprovider"
android:name="android.support.v4.content.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 xmlns:android="http://schemas.android.com/apk/res/android">
<!--代表外部存储区域的根目录下的文件 Environment.getExternalStorageDirectory()/mintudb目录-->
<external-path name="mintu" path="." />
<!--<external-path name="mintu" path="mintudb/" />-->
<!--<external-files-path name="mintu2" path="mintudb" />-->
<!--<external-path name="mintu3" path="mintudb" />-->
</paths>
//open
public void openFile(File f, Context context) {
Log.i(LOGTAG, "正在打开附件打--------" + f.getName()+"。附件大小为"+f.length());
try {
String end = f.getName().substring(f.getName().lastIndexOf(".")
+ 1, f.getName().length()).toLowerCase();
if(end.equals("amr")){
AudioRecoderUtils.getInstance().playerStart(f.getAbsolutePath());
}else {
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(android.content.Intent.ACTION_VIEW);
intent.addCategory("android.intent.category.DEFAULT");
/* 调用getMIMEType()来取得MimeType */
String type = getMIMEType(f);
/* 设置intent的file与MimeType */
if(Build.VERSION.SDK_INT>=24){
Uri contenturi=FileProvider.getUriForFile(context, "com.mintu.dcdb.fileprovider",f);
intent.setDataAndType(contenturi,type);
intent.putExtra(MediaStore.EXTRA_OUTPUT, contenturi);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
}else{
intent.setDataAndType(Uri.fromFile(f), type);
}
context.startActivity(intent);
}
} catch (Exception e) {
Log.e(LOGTAG, "打开附件" + f.getName() + "报错了,错误是-----" + e.getMessage());
}
}