安卓7.0以后打开本地文件方式
程序员文章站
2022-04-15 18:44:01
...
android7.0以后对本地文件访问做了控制,会对uri进行暴露检测,针对此有两种解决办法
第一种:暴力解决办法,关闭uri暴露检测,在要使用的activity的onCreate方法中加入即可
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
builder.detectFileUriExposure();
第二种:也是推荐的一种,更换uri的获取方式
1、在AndroidManifest中加入
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="程序包名.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
2、res/xml/下面添加配置文件file_paths.xml
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<paths>
<external-path
name="download"
path=""/>
<root-path
name="root"
path=""/>
<files-path
name="files"
path=""/>
<cache-path
name="cache"
path=""/>
<external-path
name="external"
path=""/>
<external-files-path
name="external_file_path"
path=""/>
<external-cache-path
name="external_cache_path"
path=""/>
</paths>
</resources>
3、代码中修改uri的获取方式
由
Uri.fromFile(file);
改为
public class FileProvider7 {
public static Uri getUriForFile(Context context, File file) {
Uri fileUri = null;
if (Build.VERSION.SDK_INT >= 24) {
fileUri = getUriForFile24(context, file);
} else {
fileUri = Uri.fromFile(file);
}
return fileUri;
}
public static Uri getUriForFile24(Context context, File file) {
Uri fileUri = android.support.v4.content.FileProvider.getUriForFile(context,
context.getPackageName() + ".fileprovider",
file);
return fileUri;
}
}
注意:这种方式在打开相应文件之前activity的设置,如下以打开本地图片为例
Intent intent = new Intent("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//这行一定不能漏掉
Uri uri = FileProvider7.getUriForFile(AppContext.getInstance(), file);
intent.setDataAndType(uri, "image/*");
上一篇: kotlin(六)--匿名函数
下一篇: kotlin(七). 内联函数