前言
最近应用要适配Android Q,其中有一项适配影响比较大,那就是【分区存储】。这个就是和iOS一样,不允许你随便写文件到内存卡,以前我们可以任意在内存卡上建文件夹和建文件,每个应用都这么搞的话,内存卡目录真的很乱。升级Android Q后,当targetSdkVersion>=Q,就不允许这样做了。还用之前的方法保存图片,会保存不了。
注意点
假如手机系统是Q,先安装了targetSdkVersion<Q的应用,然后应用升级targetSdkVersion>=Q,这个情况,用之前的方法,依然是可以保存图片的。一旦这个应用卸载,再重新安装的话,就不能保存图片了。所以,不要高兴得太早。还是要做适配的。
适配点
1、如果是生成一些缓存图片,素材等,可以放在这个目录:
context.getExternalFilesDir(null),这个对应的就是 /storage/emulated/0/Android/data/com.xxxx.yyy/files
这个目录下的文件,会随着应用的卸载而删除。
2、如果要保存一些海报图片,又希望这些图片在应用卸载后依然保留在手机。那就保存在公共存储目录吧,/storage/emulated/0/Pictures ,按照以前保存在内存卡新建的文件夹是行不通的了。
保存方法:
/**
* 保存图片到picture 目录,Android Q适配,最简单的做法就是保存到公共目录,不用SAF存储
*
* @param context
* @param bitmap
* @param fileName
*/
public static boolean addPictureToAlbum(Context context, Bitmap bitmap, String fileName) {
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.Images.Media.DISPLAY_NAME, fileName);
contentValues.put(MediaStore.Images.Media.DESCRIPTION, fileName);
contentValues.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
Uri uri = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
OutputStream outputStream = null;
try {
outputStream = context.getContentResolver().openOutputStream(uri);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}