当前位置: 首页 > article >正文

Android 图片保存

  • 低版本还是老方法,在DCIM文件夹下保存File,然后发个广播通知相册刷新
  • 新版本要用Media Store Api,本质上还是OutputStream写。
  • 而且高版本不需要write权限,10以下还是需要write权限的。
public static void addImageToGallery(final Context context,
                                         final Bitmap src,
                                         final Bitmap.CompressFormat format,
                                         final int quality,
                                         final boolean recycle) {
        String suffix = Bitmap.CompressFormat.JPEG.equals(format) ? "JPG" : format.name();
        String fileName = System.currentTimeMillis() + "_" + quality + "." + suffix;
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
        
            File picDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
            File destFile = new File(picDir, context.getPackageName() + "/" + fileName);
            if (!save(src, destFile, format, quality, recycle)) {
                return;
            }
            Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
            intent.setData(Uri.parse("file://" + destFile.getAbsolutePath()));
            context.sendBroadcast(intent);
        } else {
            ContentValues contentValues = new ContentValues();
            contentValues.put(MediaStore.Images.Media.DISPLAY_NAME, fileName);
            contentValues.put(MediaStore.Images.Media.MIME_TYPE, "image/*");
            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.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_DCIM + "/" + context.getPackageName());
            contentValues.put(MediaStore.MediaColumns.IS_PENDING, 1);
            Uri uri = context.getContentResolver().insert(contentUri, contentValues);
            if (uri == null) {
                return;
            }
            OutputStream os = null;
            try {
                os = context.getContentResolver().openOutputStream(uri);
                src.compress(format, quality, os);

                contentValues.clear();
                contentValues.put(MediaStore.MediaColumns.IS_PENDING, 0);
                context.getContentResolver().update(uri, contentValues, null, null);
            } catch (Exception e) {
                context.getContentResolver().delete(uri, null, null);
                e.printStackTrace();
            } finally {
                try {
                    if (os != null) {
                        os.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

public static boolean save(final Bitmap src,
                               final File file,
                               final Bitmap.CompressFormat format,
                               final int quality,
                               final boolean recycle) {
        OutputStream os = null;
        boolean ret = false;
        try {
            os = new BufferedOutputStream(new FileOutputStream(file));
            ret = src.compress(format, quality, os);
            if (recycle && !src.isRecycled()) {
                src.recycle();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (os != null) {
                    os.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return ret;
    }

http://www.kler.cn/a/390443.html

相关文章:

  • 在linux中使用nload实时查看网卡流量
  • ️️一篇快速上手 AJAX 异步前后端交互
  • NoSQL数据库与关系型数据库的主要区别
  • 深度学习代码笔记
  • 1小时构建Vue3知识体系之vue的生命周期函数
  • P8680 [蓝桥杯 2019 省 B] 特别数的和
  • electron 中 contextBridge 作用
  • JVM 处理多线程并发执行
  • 什么是JVM实现
  • 电力巡检新利器:输电线路全景与云台变焦视频监控装置
  • 【算法-插入排序】基础知识,代码示例和应用场景
  • IDEA 如何手动创建spring boot工程
  • Day107:代码审计-PHP模型开发篇MVC层RCE执行文件对比法1day分析0day验证
  • .NET Core 应用程序如何在 Linux 中创建 Systemd 服务 ?
  • Vue3 - 小兔仙 - day2
  • 面试经典 150 题:121,125
  • 批量混剪矩阵发布助力短视频营销快速获客
  • 深度学习服务器租赁AutoDL
  • 使用git进行多人协作开发项目流程
  • Android WebSocket ping pong机制
  • MySQL如何利用索引优化ORDER BY排序语句
  • 【博主推荐】VUE开发常用技术点收集
  • QT中使用图表之QChart绘制动态折线图
  • Sam Altman:年底将有重磅更新,但不是GPT-5!
  • C# 有趣的小程序—桌面精灵详细讲解
  • docker save 和 docker load介绍