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.
一看文档一脸懵逼 没看懂什么 各种