You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将ImageView中的图片保存到系统相册?

实现点击按钮保存ImageView内容到系统相册方案

1. 前置权限配置

在AndroidManifest.xml中添加对应权限声明:

<!-- Android 13及以上所需图片媒体权限 -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<!-- Android 9及以下所需写存储权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" />

应用启动后需先动态申请上述权限,权限通过后再执行保存逻辑。

2. 按钮点击事件核心逻辑

给下载按钮绑定点击事件,在点击回调中执行如下逻辑:

2.1 从ImageView中获取Bitmap实例

// 先判断ImageView的drawable是否为BitmapDrawable
if (imageView.getDrawable() instanceof BitmapDrawable) {
    Bitmap targetBitmap = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
    saveBitmapToAlbum(targetBitmap);
} else {
    // 若为矢量图/其他类型Drawable,需自行转为Bitmap后再执行保存
}

2.2 实现保存Bitmap到相册的方法

private void saveBitmapToAlbum(Bitmap bitmap) {
    // 构造图片存入相册的参数
    ContentValues values = new ContentValues();
    values.put(MediaStore.Images.Media.DISPLAY_NAME, "IMG_" + System.currentTimeMillis() + ".jpg");
    values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
    // Android 10及以上指定保存路径为 Pictures 目录下的自定义文件夹
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        values.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES + "/自定义应用文件夹名");
        values.put(MediaStore.Images.Media.IS_PENDING, 1);
    }

    ContentResolver resolver = getContentResolver();
    Uri imageUri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
    if (imageUri != null) {
        try {
            OutputStream outputStream = resolver.openOutputStream(imageUri);
            // 压缩Bitmap到输出流,质量参数100为不压缩,可按需调整
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
            outputStream.close();

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                values.clear();
                values.put(MediaStore.Images.Media.IS_PENDING, 0);
                resolver.update(imageUri, values, null, null);
            }
            // 保存成功提示
            Toast.makeText(this, "图片已保存到相册", Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
            e.printStackTrace();
            Toast.makeText(this, "保存失败", Toast.LENGTH_SHORT).show();
        }
    }
}

注意事项

  • 保存操作属于IO操作,建议放到子线程执行,避免阻塞主线程引发ANR
  • 若ImageView的图片是从网络加载的,需确保图片完全加载完成后再执行获取Bitmap的操作
  • 如果需要保存带透明通道的图片,将MIME类型和压缩格式改为PNG即可

内容的提问来源于stack exchange,提问作者user15084425

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 05:18:02