Android10权限变更—分区存储
-
androidQ的变更
- 独立的存储沙盒:应用通过文件路径保存的文件都会被保存在应用的沙盒中,App卸载沙盒内的所有内容会被删除
- 共享目录:有些文件譬如图片等,开发者不希望这些文件随着app的卸载被删除,可以将他们通过谷歌提供的MediaProvider或者SAF保存到共享目录中。
- 权限:app读取自己沙盒和自己存放在公共目录下的文件是不需要申请任何权限的,但是如果app要读取其他应用创建的公共目录下的文件,是需要申请READ_EXTERNAL_STORAGE权限;系统只提供了读的权限,所以是无法通过申请写的权限修改其他应用创建的文件。
- 路径问题:读取私有目录下的文件,可以直接使用文件的路径直接获取。应用和其他应用保存在共有目录的下的多媒体文件,都只能通过Media一些方法进行获取。通过路径方式是获取不到的。
-
androidQ的存储结构示意图
-
向沙盒内写入文件
建议将: 内部存储:/data/user/0/应用包名/files和内置外部存储:/storage/emulated/0/Android/data/应用包名/files作为沙盒。
代码:
/* * 将图片存到沙盒中,建议写到this.getExternalFilesDir(null)文件夹下 * this.getFilesDir()所在的内存储空间有限,满了影响手机运行 * */ private void saveImageToBox(String fileName, Bitmap bitmap) { final String ImagePath = "zwk"; try { File PictureFile = this.getFilesDir(); // 内存储的私有目录中 //File PictureFile = this.getExternalFilesDir(null); // 内置外存储的私有文件夹 File ImageFileDirectory = new File(PictureFile + File.separator + ImagePath); if (ImageFileDirectory.exists()) { File photoFile = new File(ImageFileDirectory + File.separator + fileName); FileOutputStream fileOutputStream = new FileOutputStream(photoFile); bitmap.compress(Bitmap.CompressFormat.PNG, 90, fileOutputStream); fileOutputStream.flush(); fileOutputStream.close(); } else if (ImageFileDirectory.mkdir()) { File photoFile = new File(ImageFileDirectory + File.separator + fileName); FileOutputStream fileOutputStream = new FileOutputStream(photoFile); bitmap.compress(Bitmap.CompressFormat.PNG, 90, fileOutputStream); fileOutputStream.flush(); fileOutputStream.close(); } } catch (Exception e) { Log.d("zwk", "异常了"); } }
-
读写公共目录
-
写入公共目录
- 通过提供的ContentValues设置一些文件的信息;
- getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)方法设置文件插入文件的Uri;
- getContentResolver().openOutputStream(uri)和读取自己公共目录下创建的文件bitmap.compress(Bitmap.CompressFormat.JPEG, 90, outputStream); 写入文件
代码:
/* * 将文件写入到公共目录中去,需要根据文件的类型,找到合适的Environment.DIRECTORY_xx路径 * 如:图片可以放到Environment.DIRECTORY_PICTURES|Environment.DIRECTORY_DCIM中 * 文件不同,使用的MediaStore.xx不同 * 如:图片需要使用MediaStore.Images.Media * * */ private void saveImageToPublic(String fileName, Bitmap bitmap) { ContentValues contentValues = new ContentValues(); contentValues.put(MediaStore.Images.Media.DESCRIPTION,
-