Android Q适配之保存图片到内存卡

前言

最近应用要适配Android Q,其中有一项适配影响比较大,那就是【分区存储】。这个就是和iOS一样,不允许你随便写文件到内存卡,以前我们可以任意在内存卡上建文件夹和建文件,每个应用都这么搞的话,内存卡目录真的很乱。升级Android Q后,当targetSdkVersion>=Q,就不允许这样做了。还用之前的方法保存图片,会保存不了。

注意点

假如手机系统是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;
    }

你可能感兴趣的:(Android Q适配之保存图片到内存卡)