最近作項目發現Android 8.0+ 更新安裝apk時 出現安裝失敗的狀況 總結緣由是 缺乏安裝的權限android
Android 8.0 (Android O)爲了針對一些流氓軟件引導用戶安裝其餘無關應用。在應用權限設置的「特殊訪問權限」中,加入了「安裝其餘應用」的設置。app
簡單的方法 能夠直接在Manifest.xml中加入下面的權限:(親測可用)ide
<uses-permissionandroid:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
另外當咱們執行安裝的代碼後 都會加入殺死進程的代碼 以下:post
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { uri = FileProvider.getUriForFile(this, "com.example.fileprovider",tempFile); //此處爲Uri臨時受權 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); } else { uri = Uri.fromFile(tempFile); }
private void install(String apkPath) {
Intent intent = new Intent(Intent.ACTION_VIEW);
//Android 7.0+ 須要用FileProvider的方式訪問隱私目錄(好比相冊)
if (Environment.SYSTEM_VERSION_CODE >= Build.VERSION_CODES.N) {
uri = FileProvider.getUriForFile(this, "com.example.fileprovider",tempFile);
//此處爲Uri臨時受權
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
uri = Uri.fromFile(tempFile);
}else{
uri = Uri.fromFile(tempFile);
}
intent.setDataAndType(uri, "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent); //最後殺死進程 Handler mHandler=new Handler(context); mHandler.postDealy(new Runnable(){ public void run(){ //或者是 System.exit(0); android.Process.KillProcess((android.os.Process.myPid()); } },500);//在這裏延遲 500ms 是爲了防止app使用FileProvider獲取隱私文件時被殺死 致使安裝失敗}