Android 7.0 手机 路径问题
原因 :
Android7.0又引入“私有目录被限制访问”,“StrictMode API 政策”。
解释:
私有目录被限制访问“ 是指在Android7.0中为了提高私有文件的安全性,面向 Android N 或更高版本的应用私有目录将被限制访问。这点类似iOS的沙盒机制。
" StrictMode API 政策" 是指禁止向你的应用外公开 file:// URI。 如果一项包含文件 file:// URI类型 的 Intent 离开你的应用,应用失败,并出现 FileUriExposedException 异常。
解决方法:
使用FileProvider解决上述异常
步骤:
1. 声明FileProvider,这里是自己实现一个子类,子类为空class
声明FileProvider
exported:要求必须为false,为true则会报安全异常。
grantUriPermissions:true,表示授予 URI 临时访问权限。
authorities组件标识,按照江湖规矩,都以包名开头,避免和其它应用发生冲突。
共享目录文件2. 指定共享目录 "@xml/provider_paths"
注意:
列举上述代码中path="",是有特殊意义的,它代码根目录,也就是说你可以向其它的应用共享根目录及其子目录下任何一个文件了。
如果你将path设为path="pictures",那么它代表着根目录下的pictures目录(eg:/storage/emulated/0/pictures),如果你向其它应用分享pictures目录范围之外的文件是不行的。
ProviderUtil类3.定义ProviderUtil
调用4.调用代码以安装应用为例 (7.0以上修改路径,以下正常)
补充:
files-path --表示Context.getFilesDir()目录或者其子目录。 -- 示例: /data/data/com.chen.gradle/files/test1
cache-path--表示Context.getCacheDir()目录或者其子目录。--示例: /data/data/com.chen.gradle/cache/test2
external-path--表示Environment.getExternalStorageDirectory()目录或者其子目录。--示例: /storage/emulated/0/test3
external-files-path--表示Context.getExternalFilesDir(null)目录或者其子目录。--示例:/storage/emulated/0/Android/data/com.chen.gradle/files/test4
external-cache-path--表示Context.getExternalCacheDir()目录或者其子目录。--示例: /storage/emulated/0/Android/data/com.chen.gradle/cache/test5