Android7.0
以后使用之前的方式apk应用会直接崩溃掉,原因就是 Android7.0
做了一些权限更改:
- 私有文件的文件权限不应再由所有者放宽,为使用
MODE_WORLD_READABLE
和/或MODE_WORLD_WRITEABLE
而进行的此类尝试将触发SecurityException
。 - 传递软件包网域外的
file:// URI
可能给接收器留下无法访问的路径。因此,尝试传递file:// URI
会触发FileUriExposedException
。分享私有文件内容的推荐方法是使用FileProvider
。
具体项目中首先创建 xml
文件夹,创建 file_paths.xml
文件,文件内容如下:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path
name="files_root"
path="/Download/" />
</paths>
在 manifest
文件中声明如下:
<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/files_paths" />
</provider>
附上安装 apk
的代码
private void installApk() {
File file = new File(DownLoadDir + "应用名.apk");
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (Build.VERSION.SDK_INT >= 24) {
Uri apkUri = FileProvider.getUriForFile(getApplicationContext(), "包名.FileProvider", file);
//添加这一句表示对目标应用临时授权该Uri所代表的文件
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
} else {
intent.setDataAndType(Uri.parse("file://" + file.getAbsolutePath()), "application/vnd.android.package-archive");
}
startActivity(intent);
}