Android版本更新后安装闪退或者7.0以上(自动安装)文件访问报异常android.os.FileUriExposedException: file:///storage/emulated/0/a

情形:(1)App版本更新之后安装完成后闪退

          (2)Android7.0以上访问文件报异常

原因:Android N(对应sdk24)(版本7.0)及以上对访问文件权限收回,按照Android N的要求,若要在应用间共享文件,您应发送一项 content://URI,并授予 URI 临时访问权限。 

而进行此授权的最简单方法:使用 FileProvider类。

步骤一:在AndroidManifest.xml文件中注册一个provider


            
        


步骤二:创建filepaths.xml文件(res - xml目录下)
 



    
        
        
    


上面的两个属性要根据自己的使用来配置。

其中  就是手机的外置存储目录。

path="自己共享的目录"

其他节点说明:

    
    
    
    
    
    
    
    
    
    
    
    
    
    

   

   

步骤三:应用内自动安装

private Intent getInstallIntent() {
 
            String fileName = savePath + appName + ".apk";
            Uri uri = null;
            Intent intent = new Intent(Intent.ACTION_VIEW);
        try {
            if (Build.VERSION.SDK_INT >= 24) {//7.0 Android N    
            //com.xxx.xxx.fileprovider为上述manifest中provider所配置相同
                uri = FileProvider.getUriForFile(mContext, "你自己的包名.fileprovider", new File(fileName));
                intent.setAction(Intent.ACTION_INSTALL_PACKAGE);
                intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//7.0以后,系统要求授予临时uri读取权限,安装完毕以后,系统会自动收回权限,该过程没有用户交互
            } else {//7.0以下
                uri = Uri.fromFile(new File(fileName));
                intent.setAction(Intent.ACTION_VIEW);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            }
            intent.setDataAndType(uri, "application/vnd.android.package-archive");
            startActivity(intent);
            return intent;
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        }catch (ActivityNotFoundException e){
            e.printStackTrace();
        }catch (Exception e){
            e.printStackTrace();
        }
        return intent;
    }


这样就顺利解决访问文件权限的问题了,完成自动安装

你可能感兴趣的:(Android高级)