储存权限
安卓的权限大概分三种
普通权限 :只需要在清单文件中注册即可(例如网络权限)危险权限 :需要在代码中动态申请,以弹系统Dialog的形式进行请求(例如储存权限)特殊权限 :需要在代码中动态申请,以跳系统Activity的形式进行请求(例如安卓11中的所有文件访问权限)
关于储存权限
anroid 6之前 ,它是普通权限,在清单文件中注册即可anroid 6-10之间 ,它是危险权限,需要以系统Dialog的形式请求android 11后 ,它是特殊权限,需要跳转至系统的“所有文件访问权限”进行授权
android 6前的储存权限
很简单,在清单文件中注册即可
1 | <!-- 读取--> |
android 7-9的储存权限
清单权限+Dialog动态申请
清单文件
1 | <!-- 读取--> |
动态申请,使用时调用RequestPermissions()方法即可
1 | // 权限动态申请 |
android 10的储存权限
清单权限+Dialog动态申请
清单文件,如果不加入android:requestLegacyExternalStorage=”true”,在安卓 10.0 的设备无法正常读写外部存储的文件
1 | <!-- 读取--> |
动态申请
1 | // 跟android 7-9一样,不赘述 |
android 11后的储存权限
清单文件+Dialog动态申请+Activity跳转申请
清单文件
1 | <!-- 读取外部储存--> |
动态申请
1 | // 权限动态申请 |
内部储存
随应用卸载被删除
data/data/packageName/目录下
- /data/data/packageName/shared_prefs
- /data/data/packageName/databases
- /data/data/packageName/files
- /data/data/packageName/cache
1 | //获取/data/data/packageName/cache |
FileOutputStream(储存数据)
打开输出流
1 | // 打开输出流。传入文件名,文件保护类型 |
此时会提示捕获异常,根据提示操作即可
1 | // 添加异常捕获 |
将字符串转为字节组并写入内部储存
1 | // 字符串 |
添加finally,并在其中执行关闭输出流
1 | FileOutputStream fileOutputStream = null; |
FileInputStream(读取数据)
打开输入流
1 | FileInputStream fileInputStream = null; |
添加异常捕获
1 | FileInputStream fileInputStream = null; |
定义字节组,创建字符串拼接对象
1 | // 定义字节组,1024表示最大储存1024字节,每次读取最多读1024字节 |
循环读取文件字节组,并转换为字符串
1 | FileInputStream fileInputStream = null; |
外部储存
File类中:
- getAbsolutePath()获取绝对路径
- getPath()获取相对路径
- getName()获取文件名
- list()获取指定路径下所有文件(夹)名称数组
- listFiles()获取指定目录下所有文件(夹)File数组
公有目录
/storage/emulated/0/下的目录
获取公有目录
1 | //公有目录根目录 |
私有目录
私有目录随应用卸载而删除
/storage/emulated/0/Android/data/packageName目录下
- 缓存目录: /storage/emulated/0/Android/data/packageName/cache
- 文件目录: /storage/emulated/0/Android/data/packageName/files
FileOutputStream(储存数据)
Environment.getExternalStorageDirectory()外部储存根目录
mkdir()只可以创建一个文件夹,mkdirs()可以创建folder1/folder2/folder3一连串的文件夹
1 | // 获取外部储存根目录/myFolder路径 |
外部储存使用new FileOutputStream创建输出流,而非打开
1 | String str = "外部储存"; |
FileInputStream(读取数据)
外部储存使用new FileInputStream创建输入流,而非打开
getAbsolutePath()会将Environment.getExternalStorageDirectory()的File文件对象类型转换为String
1 | // 创建输入流变量 |