Android保存图片到系统图库

💡 原文中文,约1800字,阅读约需5分钟。
📝

内容提要

Android开发中保存二维码到相册,可将Bitmap写入SD卡文件,再插入系统图库并通知更新。Android 4.4之前使用MEDIA_MOUNTED广播扫描,4.4起因权限限制会报错,需改用MediaScannerConnection.scanFile扫描指定文件。

🔎

延伸解读

Android 4.4 的广播权限变更

文章指出,在 Android 4.4 之前,开发者可以通过发送 ACTION_MEDIA_MOUNTED 广播来通知系统扫描 SD 卡,但 4.4 开始这一操作会抛出 Permission Denial 异常,因为系统限制了只有系统应用才能发送该广播。这意味着针对 4.4 及以上版本,必须调整图库更新策略,不能沿用旧方法。

使用 MediaScannerConnection 替代广播

针对 4.4 的权限限制,文章给出的解决方案是改用 MediaScannerConnection.scanFile 方法,对具体文件或文件夹进行扫描。示例中扫描的是 DCIM 目录下的文件,这样既能避免广播权限问题,又能让图库及时更新。开发者应注意传入正确的文件路径。

保存图片的基本流程与注意事项

文章提供的代码展示了保存图片到相册的典型步骤:先将 Bitmap 压缩为 JPEG 并写入 SD 卡文件,然后通过 MediaStore.Images.Media.insertImage 插入系统图库,最后通知图库更新。需要注意的是,代码中使用了 Environment.getExternalStorageDirectory(),在 Android 10 及以上版本可能受分区存储限制,需适配。

Q&A

Android开发中如何将Bitmap保存到系统图库?

首先将Bitmap保存为SD卡上的文件,然后通过MediaStore.Images.Media.insertImage将文件插入系统图库,最后发送广播或使用MediaScannerConnection通知图库更新。

Android 4.4之前和之后通知图库更新的方式有什么不同?

Android 4.4之前使用发送Intent.ACTION_MEDIA_MOUNTED广播来通知扫描SD卡;Android 4.4及以后由于权限限制,发送该广播会报错,需改用MediaScannerConnection.scanFile扫描指定文件。

为什么在Android 4.4上发送MEDIA_MOUNTED广播会报Permission Denial错误?

因为Android 4.4中限制了只有系统应用才有权限使用广播通知系统扫描SD卡,普通应用发送该广播会抛出Permission Denial异常。

Android 4.4之后用什么方法替代MEDIA_MOUNTED广播来通知图库更新?

使用MediaScannerConnection.scanFile方法,传入要扫描的文件路径数组,即可通知图库更新指定文件。

保存图片到图库时,如何将Bitmap写入SD卡文件?

创建目录(如Environment.getExternalStorageDirectory()下的自定义文件夹),生成文件名,通过FileOutputStream将Bitmap以JPEG格式压缩写入文件。

使用MediaScannerConnection.scanFile时,路径参数应该怎么传?

可以传入具体文件的绝对路径,例如Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getPath() + "/" + fileName,也可以传入文件夹路径进行扫描。

🏷️

标签

➡️

继续阅读