Android保存照片到相册

本文介绍了随着Android系统版本更新,尤其是Android 11后保存照片到相册的权限和路径变化。由于Android 11加强了隐私安全,应用无法直接访问根目录,而是需要在Manifest中申请旧版存储权限来实现兼容。文章讨论了如何在不同版本上保存图片,并提供了代码示例,同时指出在Android 11及更高版本中保存到相册可能需要存储权限。
摘要由CSDN通过智能技术生成

Android保存照片到相册

前言

随着Android系统的不断升级 从最初的第一个版本 更新到现在 Android 11.0 Beta都出炉了 Android 11.0也即将面试 系统的不断更新完善 用户体验也是蹭蹭蹭的 隐私安全方面也是越来越给力了 这对用户当然是一级棒 对于开发者 简直无力吐槽 因为碎片化问题 加上版本更新迭代 废弃淘汰一堆 API 脑瓜子疼。

正文

这几天刚刚需要保存视频到相册 发现 我去 以前的方法好像不太给力了,磨了 我好久。。因为我手机是Android 10 版本 从用户隐私加强了 最大的变化就是 存储权限

Android 10 在外部存储设备中为每个应用提供了一个“隔离存储沙盒”(例如 /sdcard)。任何其他应用都无法直接访问您应用的沙盒文件。由于文件是您应用的私有文件,因此您不再需要任何权限即可在外部存储设备中访问和保存自己的文件。此变更可让您更轻松地保证用户文件的隐私性,并有助于减少应用所需的权限数量。

所以就是说我们不能直接访问 根目录 了? 其实 在Android 10 上还不是完全杜绝你使用的 你还是可以兼容低版本 那怎么做呢

<application
	...
	android:requestLegacyExternalStorage="true">
</application>

只需要在 你的AndroidManifest.xml 文件中 加入这行代码 意思就是申请旧版本的外部存储 那么你还是可与愉快玩耍的

可是旧版本的外部存储权限都已经废弃了 这样做是可以解决当前的问题 但是在Android 11 上 讲严格执行沙盒存储方式 也就是说 这样的代码在Android 11 上已经无法兼容了 并且的 10 的系统兼容也不够

撸码环节

那么开始撸代码把

/**
 *保存bitmap
 */
fun saveBitmap2Gallery(context: Context, bitmap: Bitmap): Boolean {
   
    val name=System.currentTimeMillis().toString()
    val photoPath=Environment.DIRECTORY_DCIM + "/Camera"
    val contentValues = ContentValues().apply {
   
            put(MediaStore.MediaColumns.DISPLAY_NAME,name )
            put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")
            put(MediaStore.MediaColumns.RELATIVE_PATH, photoPath)//保存路径
            put(MediaStore.MediaColumns.IS_PENDING, true)
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
   
            //返回出一个URI
            val insert = context.contentResolver.insert(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                contentValues
            ) ?: return false //为空的话 直接失败返回了

            //这个打开了输出流  直接保存图片就好了
            context.contentResolver.openOutputStream(insert).use {
   
                it ?: return false
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, it)
            }
            return true
        } else {
   
            MediaStore.Images.Media.insertImage(context.contentResolver, bitmap, "title", "desc")
            return true
        }
    }

就上面的代码 可以直接保存了 如果不挑剔 应该是可以使用的了 但是发现一个问题 除了Android 10以上的 用 MediaStore 提示是废弃的 蒙蔽 为什么废弃呢 我们进入文档看看

inserting of images should be performed using {
   @link MediaColumns#IS_PENDING}, which offers richer control over lifecycle.

一看文档一脸懵逼 没看懂什么 各种

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值