Android bitmap保存到系统相册

本文介绍了一种在Android设备上将图片保存至系统相册的方法,并提供了完整的代码实现。文章详细展示了如何创建文件夹、保存图片以及更新系统相册。

简单使用

话不多说,直接上代码,这里简易用用~ 有问题再沟通哈

   	// 相册的名字
    public static final String PIC_DIR_NAME = "wyyyPhotos";

    public static void saveBitmap2Gallery(String fileName, Bitmap bitmap) {
        File mPicDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), PIC_DIR_NAME);
        OutputStream out = null;
        String[] pathArray = null;
        String[] typeArray = null;
        try {
        	// Android 10版本 创建文件夹不成功,这里没有过多去研究
            boolean isMk = mPicDir.mkdirs();
            Log.d("ImageUtils ", "isMk = " + isMk);
            File mPicFile = new File(mPicDir, fileName + ".jpg");
            String mPicPath = mPicFile.getAbsolutePath();
            Log.d("ImageUtils ", "mPicPath = " + mPicPath);
            pathArray = new String[]{mPicFile.getAbsolutePath()};
            typeArray = new String[]{"image/jpeg"};
            ContentValues values = new ContentValues();
            ContentResolver resolver = CoreApp.getAppContext().getContentResolver();
            values.put(MediaStore.Images.ImageColumns.DATA, mPicPath);
            values.put(MediaStore.Images.ImageColumns.DISPLAY_NAME, fileName);
            values.put(MediaStore.Images.ImageColumns.MIME_TYPE, "image/jpeg");
            values.put(MediaStore.Images.ImageColumns.DATE_TAKEN, System.currentTimeMillis() + "");
            // 插入相册
            Uri uri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
            if (uri != null) {
                out = resolver.openOutputStream(uri);
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
                Log.d("ImageUtils ", "compress");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (out != null) {
                try {
                    out.flush();
                    out.close();
                    Log.d("ImageUtils", "finally close");
                    // 扫描刷新
                    MediaScannerConnection.scanFile(CoreApp.getAppContext(), pathArray, typeArray, new MediaScannerConnection.OnScanCompletedListener() {
                        @Override
                        public void onScanCompleted(String s, Uri uri) {
                            Log.d("ImageUtils", "onScanCompleted  s->" + s);
                        }
                    });
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
### 如何用 Kotlin 将 Bitmap 保存相册Android 开发中,将 Bitmap 保存相册是一个常见的需求。以下是使用 Kotlin 实现该功能的代码示例和详细说明。 #### 1. 权限声明 首先需要在 `AndroidManifest.xml` 文件中声明存储权限: ```xml <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ``` 注意:对于 Android 10(API 级别 29)及以上版本,推荐使用 `MediaStore` API 而不是直接操作文件系统[^3]。 --- #### 2. 保存 Bitmap相册的 Kotlin 示例代码 以下代码展示了如何将 Bitmap 插入系统相册,并设置图片的挂起状态(IS_PENDING)[^2]: ```kotlin import android.content.ContentValues import android.graphics.Bitmap import android.net.Uri import android.os.Build import android.provider.MediaStore import androidx.core.content.ContextCompat fun saveBitmapToGallery(context: Context, bitmap: Bitmap, fileName: String): Uri? { val resolver = context.contentResolver var imageUri: Uri? = null // 创建 ContentValues 对象以插入媒体库 val contentValues = ContentValues().apply { put(MediaStore.Images.Media.DISPLAY_NAME, fileName) put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg") if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { put(MediaStore.Images.Media.IS_PENDING, 1) put(MediaStore.Images.Media.RELATIVE_PATH, "DCIM/SavedImages") } } // 插入媒体库并获取返回的 URI imageUri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues) if (imageUri == null) return null try { // 将 Bitmap 写入输出流 resolver.openOutputStream(imageUri).use { outputStream -> if (!bitmap.compress(Bitmap.CompressFormat.JPEG, 95, outputStream)) { throw IOException("Failed to compress Bitmap") } } // 更新 IS_PENDING 状态为 0,表示图片已成功保存 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { contentValues.clear() contentValues.put(MediaStore.Images.Media.IS_PENDING, 0) resolver.update(imageUri, contentValues, null, null) } } catch (e: Exception) { e.printStackTrace() resolver.delete(imageUri, null, null) imageUri = null } return imageUri } ``` --- #### 3. 使用示例 以下是如何调用上述函数的示例代码: ```kotlin val bitmap = BitmapFactory.decodeResource(resources, R.drawable.sample_image) val fileName = "saved_image_${System.currentTimeMillis()}.jpg" val savedUri = saveBitmapToGallery(this, bitmap, fileName) if (savedUri != null) { Toast.makeText(this, "Image saved to gallery: $savedUri", Toast.LENGTH_SHORT).show() } else { Toast.makeText(this, "Failed to save image", Toast.LENGTH_SHORT).show() } ``` --- #### 4. 注意事项 - **权限处理**:如果目标设备运行的是 Android 6.0(API 级别 23)或更高版本,必须动态请求存储权限[^3]。 - **Android 10 及以上**:从 Android 10 开始,推荐使用 `MediaStore` API 替代直接写入文件系统的方式[^3]。 - **异常处理**:确保在保存过程中捕获可能的异常,并清理无效的 URI。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值