Android 保存图片并刷新相册(无需权限)

news/2025/2/15 21:57:29/

一、背景

之前的保存图片吧,在Android11之前,我会去申请WIRITE权限,11之后,我又去申请MANAGE_EXTERNAL_STORAGE这个权限,该权限将授权读写所有共享存储内容,这也将同时包含非媒体类型的文件。但是在google上架的时候,MANAGE_EXTERNAL_STORAGE属于敏感权限,需要向谷歌做声明,做了,没过,谷歌说可以不要这个权限也可以保存,看来是我无知了,于是去研究了一下下,有了下面的方法。

二、实现

    @SuppressLint("UseCompatLoadingForDrawables")@AfterPermissionGranted(200)fun saveFreshAppImageToGallery(context: PreViewActivity, imageResId: Int) {val drawable = context.getDrawable(imageResId)if (drawable is BitmapDrawable) {val bitmap = drawable.bitmapval displayName = "${System.currentTimeMillis()}.jpg"val values = ContentValues().apply {put(MediaStore.Images.Media.DISPLAY_NAME, displayName)put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis() / 1000)}val contentResolver = context.contentResolverval collection =MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)val item = contentResolver.insert(collection, values)item?.let { uri ->try {val outputStream = contentResolver.openOutputStream(uri)bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream)outputStream?.close()Toast.makeText(context, "Save successfully!", Toast.LENGTH_SHORT).show()val mediaScanIntent = Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE)mediaScanIntent.data = uricontext.sendBroadcast(mediaScanIntent)} catch (e: Exception) {Toast.makeText(context, "Save Failed!", Toast.LENGTH_SHORT).show()e.printStackTrace()}}}}

其中:通知相册刷新的逻辑是下面代码

val mediaScanIntent = Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE)
mediaScanIntent.data = uri
context.sendBroadcast(mediaScanIntent)

或者下面的方法

    private fun saveToGallery(photoFile: File) {val contentValues = ContentValues().apply {put(MediaStore.Images.Media.DISPLAY_NAME, "photo.jpg")put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {put(MediaStore.Images.Media.IS_PENDING, 1)}}val contentResolver = contentResolverval collectionUri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)} else {MediaStore.Images.Media.EXTERNAL_CONTENT_URI}val imageUri = contentResolver.insert(collectionUri, contentValues)imageUri?.let { uri ->try {contentResolver.openOutputStream(uri)?.use { outputStream ->val inputStream = FileInputStream(photoFile)inputStream.copyTo(outputStream)inputStream.close()outputStream.close()}if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {contentValues.clear()contentValues.put(MediaStore.Images.Media.IS_PENDING, 0)contentResolver.update(uri, contentValues, null, null)}} catch (e: IOException) {}}}

原理都是一样的


http://www.ppmy.cn/news/1125467.html

相关文章

基于springboot+vue的校园资产管理系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

vue中request.js中axios请求和(若依)文件通用下载方法封装

vue中request.js中axios请求和(若依)文件通用下载方法封装 1.request.js import axios from axios import { Message, Loading } from element-ui import { saveAs } from file-saver // 创建axios实例 const request axios.create({// 这里可以放一…

[运维|数据库] 数据库迁移到金仓数据库时,sys_user表报错原因

参考文献 金仓数据库字段_金仓数据库KingBase8迁移SQL问题汇总、 kingbase数据库搜不到自己定义的SYS_USER等表 原因 数据库中存在表sys_user,人大金仓数据库存在系统表sys_user,表冲突导致代码中查询的时候查的是系统表sys_user,而不是我…

第3章-指标体系与数据可视化-3.1.1-Matplotlib绘图库

目录 3.1 Python可视化 3.1.1 Matplotlib绘图库 1. 线图 2. 饼图 3. 条形图 4. 直方图 5.散点图

深入了解Python和OpenCV:图像的卡通风格化

前言 当今数字时代,图像处理和美化已经变得非常普遍。从社交媒体到个人博客,人们都渴望分享独特且引人注目的图片。本文将介绍如何使用Python编程语言和OpenCV库创建令人印象深刻的卡通风格图像。卡通风格的图像具有艺术性和创意,它们可以用…

Java深入理解线程的三大特性

目录 1 CPU缓存导致可见性问题2 线程切换导致原子性问题3 性能优化导致有序性问题4 JMM(Java Memory Model)5 volatile6 synchronized 1 CPU缓存导致可见性问题 线程的三大特性: 可见性:Visibility有序性:Ordering原子性:Atomic…

LPA*算法图文详解

之前我们看过了A* 算法,知道了A* 算法的基本原理,但是A* 算法的缺陷也很明显:它是离线的路径规划算法,只能一次规划出路径,但是后面路径被改变的话就无法生效了。针对这个问题,人们研究出了D* 算法。D* 算法…

Linux内核启动流程-第二阶段start_kernel 函数

一. Linux内核启动 上一篇文章简单介绍了 Linux内核启动的第一阶段,即执行汇编流程。 本文简单了解一下,Linux内核启动的第二阶段:start_kernel函数,这是一个 C 函数。 本文续上一篇文章的学习,地址如下:…