关于android 版本更新中“java.lang.SecurityException:Permission Denial:opening provider”异常的解决方案

前言:基于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)”可能需要更高的权限。
以上是我遇到这个异常之后的解决方案,这样修改之后,程序可正常运行进行版本的更新。但是,其中更具体的原因现在还没弄清楚,希望有知道的这个异常引起的原因的老铁指点指点。

猜你喜欢

转载自blog.csdn.net/ygz111111/article/details/80812255