如何将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
相关产品推荐
相关产品推荐

