前言:基于android 7.0以后,调取系统默认的版本更新与之前的存在一定的差异,而最近在做更新的时候,也是各种坑,记录一下:
1.使用以下的方法进行版本更新:
private void launchInstallation(File targetFile) {
Intent intent = new Intent(Intent.ACTION_VIEW);
// Uri uri = Uri.fromFile(targetFile);
Uri uri = null;
if ( android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N){
uri = FileProvider.getUriForFile(getContext(),
getString(R.string.file_provider_authority),
targetFile);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//添加这一句表示对目标应用临时授权该Uri所代表的文件
}else{
uri = Uri.fromFile(targetFile);
}
intent.setDataAndType(uri, "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivityForResult(intent,0);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 0){
if (resultCode != 0){
//用户选择安装
Process.killProcess(Process.myPid());
}
}
}
2.在实际运行测试的时候,会出现以下的异常状况:
3.修改之后能正常更新的代码:
4.原因分析:
由报错的异常分析,主要是权限不足。通过分析代码,可以看出:
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//添加这一句表示对目标应用临时授权该Uri所代表的文件
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
这两部分做了一个调换,同时,
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
这一句也删除了,所以,推测:addFlag()需要在setFlag()之后,其次,“setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)”可能需要更高的权限。
以上是我遇到这个异常之后的解决方案,这样修改之后,程序可正常运行进行版本的更新。但是,其中更具体的原因现在还没弄清楚,希望有知道的这个异常引起的原因的老铁指点指点。