日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Android 保存圖片到本地 兼容Android 10+

 hncdman 2022-05-08 發(fā)布于湖南省


Android 保存圖片到本地(兼容Android 10+)

圖片保存在 DCIM 公開目錄

大于 28 需使用 MediaStore

小于 29 直接 new FIle

public class ImageSaveUtil {

    /**

     * 保存圖片到公共目錄

     * 29 以下,需要提前申請文件讀寫權(quán)限

     * 29及29以上的,不需要權(quán)限

     * 保存的文件在 DCIM 目錄下

     *

     * @param context 上下文

     * @param bitmap  需要保存的bitmap

     * @param format  圖片格式

     * @param quality 壓縮的圖片質(zhì)量

     * @param recycle 完成以后,是否回收Bitmap,建議為true

     * @return 文件的 uri

     */

    @Nullable

    public static Uri saveAlbum(Context context, Bitmap bitmap, Bitmap.CompressFormat format, int quality, boolean recycle) {

        String suffix;

        if (Bitmap.CompressFormat.JPEG == format)

            suffix = "JPG";

        else

            suffix = format.name();

        String fileName = System.currentTimeMillis() + "_" + quality + "." + suffix;

        if (Build.VERSION.SDK_INT < 29) {

            if (!isGranted(context)) {

                Log.e("ImageUtils", "save to album need storage permission");

                return null;

            }

            File picDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);

            File destFile = new File(picDir, fileName);

            if (!save(bitmap, destFile, format, quality, recycle))

                return null;

            Uri uri = null;

            if (destFile.exists()) {

                uri = Uri.parse("file://" + destFile.getAbsolutePath());

                Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);

                intent.setData(uri);

                context.sendBroadcast(intent);

            }

            return uri;

        } else {

            // Android 10 使用

            Uri contentUri;

            if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {

                contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;

            } else

                contentUri = MediaStore.Images.Media.INTERNAL_CONTENT_URI;

            ContentValues contentValues = new ContentValues();

            contentValues.put(MediaStore.Images.Media.DISPLAY_NAME, fileName);

            contentValues.put(MediaStore.Images.Media.MIME_TYPE, "image/*");

            contentValues.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_DCIM + "/");

            // 告訴系統(tǒng),文件還未準(zhǔn)備好,暫時(shí)不對外暴露

            contentValues.put(MediaStore.MediaColumns.IS_PENDING, 1);

            Uri uri = context.getContentResolver().insert(contentUri, contentValues);

            if (uri == null) return null;

            OutputStream os = null;

            try {

                os = context.getContentResolver().openOutputStream(uri);

                bitmap.compress(format, quality, os);

                // 告訴系統(tǒng),文件準(zhǔn)備好了,可以提供給外部了

                contentValues.clear();

                contentValues.put(MediaStore.MediaColumns.IS_PENDING, 0);

                context.getContentResolver().update(uri, contentValues, null, null);

                return uri;

            } catch (Exception e) {

                e.printStackTrace();

                // 失敗的時(shí)候,刪除此 uri 記錄

                context.getContentResolver().delete(uri, null, null);

                return null;

            } finally {

                try {

                    if (os != null)

                        os.close();

                } catch (IOException e) {

                    // ignore

                }

            }

        }

    }

    private static boolean save(Bitmap bitmap, File file, Bitmap.CompressFormat format, int quality, boolean recycle) {

        if (isEmptyBitmap(bitmap)) {

            Log.e("ImageUtils", "bitmap is empty.");

            return false;

        }

        if (bitmap.isRecycled()) {

            Log.e("ImageUtils", "bitmap is recycled.");

            return false;

        }

        if (!createFile(file, true)) {

            Log.e("ImageUtils", "create or delete file <$file> failed.");

            return false;

        }

        OutputStream os = null;

        boolean ret = false;

        try {

            os = new BufferedOutputStream(new FileOutputStream(file));

            ret = bitmap.compress(format, quality, os);

            if (recycle && !bitmap.isRecycled()) bitmap.recycle();

        } catch (IOException e) {

            e.printStackTrace();

        } finally {

            try {

                if (os != null)

                    os.close();

            } catch (IOException e) {

                // ignore

            }

        }

        return ret;

    }

    private static boolean isEmptyBitmap(Bitmap bitmap) {

        return bitmap == null || bitmap.isRecycled() || bitmap.getWidth() == 0 || bitmap.getHeight() == 0;

    }

    private static boolean createFile(File file, boolean isDeleteOldFile) {

        if (file == null) return false;

        if (file.exists()) {

            if (isDeleteOldFile) {

                if (!file.delete()) return false;

            } else

                return file.isFile();

        }

        if (!createDir(file.getParentFile())) return false;

        try {

            return file.createNewFile();

        } catch (IOException e) {

            return false;

        }

    }

    private static boolean createDir(File file) {

        if (file == null) return false;

        if (file.exists())

            return file.isDirectory();

        else

            return file.mkdirs();

    }

    private static boolean isGranted(Context context) {

        return (Build.VERSION.SDK_INT < Build.VERSION_CODES.M || PackageManager.PERMISSION_GRANTED == ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE));

    }

}

————————————————

版權(quán)聲明:本文為CSDN博主「OneGreenHand」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。

原文鏈接:https://blog.csdn.net/a295268305/article/details/108880706

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多