Android7.0发生了行为变更,禁止您的应用外部公开 file://Uri 。
如果一项包含文件 Uri 的 Intent 离开您的应用后,则应用会出现故障,并出现 FileUriExposedException 异常。
1.在AndroidManifest.xml中添加provider ,${applicationId}代表你的完成包名
…
…
2.在res下新建xml目录,新建file_paths 文件
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<paths>
<external-path path="" name="download"/>
</paths>
</resources>
external-path 为外部存储路径
files-path 为内部存储路径
name的值就像是一个常量,代表这path填写的路径,可以在请求数据Uri
拼接使用,比如cotent://xxxx/download
就等于content://xxxx/(path里的内容)
3.判断系统版本大于等于7.0,自动打开apk自动跳转到安装页面
if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.N){
installN(final Context context, final String fileSavePath);
}else{
installDownN(final Context context, final String fileSavePath);
}
/*
* 安装android7.0以上的
* @param context
* @param fileSavePath
* */
public static void installN(final Context context, final String fileSavePath) {
File file = new File(Uri.parse(fileSavePath).getPath());
String filePath = file.getAbsolutePath();
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri data = null;
data = FileProvider.getUriForFile(context, context.getPackageName() + ".fileprovider", new File(filePath));
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);/*给目标设置一个临时授权*/
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(data, "application/vnd.android.package-archive");
context.startActivity(intent);
}
/*
* 安装android7.0以下的
* @param context
* @param fileSavePath
* */
public static void installDownN(final Context context, final String fileSavePath) {
File file = new File(Uri.parse(fileSavePath).getPath());
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri data = null;
data = Uri.fromFile(file);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(data, "application/vnd.android.package-archive");
context.startActivity(intent);
}
更详细请浏览https://blog.csdn.net/One_Month/article/details/79657140?utm_source=blogxgwz7