FileUriExposedException,android7.0

2017-09-06 10:45 出处:红黑联盟 人气: 评论(0

FileUriExposedException

Android7.0以上,我们的应用将图片或者apk写入到sd卡的时候,使用另个一个应用对其进行一个访问的时候,就会出现FileUriExposedException,这个异常出现的原因在于:


Google认为使用file:// Uri存在一定的风险。比如,文件是私有的,其他app无法访问该文件,或者其他app没有申请READ_EXTERNAL_STORAGE运行时权限。解决方案是,使用FileProvider生成content:// Uri来替代file:// Uri。

具体的解决方案:
一、在manifest.xml文件中声明一个FileProvider



        
    

1、name:表示的是意思是这是一个FileProvider,是一个固定的;
2、authrities:表示的意思是具体的那个FileProvider
3、exproted:false是一个固定的写法;
4、grantUriPermissions:表示是否启用使用这个FileProvider
5、meta-data中,name:是一个固定的写法;resource:表示这个FileProvider对应的具体路径是哪个,也就是说,具体共享的目录是哪个;

二、创建file_paths.xml文件:




    


1、name表示这个路径的名字;
2、path表示这个路径下面的哪个文件夹,如果为空的话,表示当前路径;
3、external-path表示是的路径是:Environment.getExternalStorageDirectory()对应的路径;
常见的对应关系还有:


 对应getFilesDir()。
 对应getCacheDir()。
 对应Environment.getExternalStorageDirectory()。
 对应getExternalFilesDir()。
 对应getExternalCacheDir()。

这里我需要共享的路径是sd卡的根目录所有我这样写:




    


三、使用FileProvider:
这里我们以安装apk的方式,来讲解FileProvider的使用:


    File file = new File(Environment.getExternalStorageDirectory(), "app.apk");
    Intent intent = new Intent(Intent.ACTION_VIEW);
    Uri data=null;
    if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.N){
        //这里的话,我们在7.0是需要使用FileProvider;
        data = FileProvider.getUriForFile(this, "com.andy.fileprovider", file);
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    }else{
       data = Uri.fromFile(file);
    }

    intent.addCategory(Intent.CATEGORY_DEFAULT);

    intent.setDataAndType(data,
            "application/vnd.android.package-archive");

1、Uri uri=FileProvider.getUriForFile(this, “com.andy.fileprovider”, file);来获取一个uri对象;
2、添加使用这个uri的权限:intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);这样的话,就完美解决了这个问题。

本文标签: dataIntentUrifileFileProvider

相关文章

网站内容来源于互联网,仅供用于技术学习,请遵循相关法律 规,如有侵权,请联系管理员删除

Copyright © 2002-2017 JISHUX. 技术栈 版权所有

京ICP备15061484号-3