处理android11以上无法删除相册图片的问题
在android11手机上,当APP重新安装后,无法删除之前在APP上保存的图片,是因为没有app没有修改这张图片的权限,所以需要重新手动申请权限,先上图:
功能代码实现:
1、创建一个fragment,用于处理fragment 的回调信息。如果是activity的话,直接在 onActivityResult处理就可以了
class ActivityResultFragment : Fragment() {private var onActivityResultListener: ActivityResultListener? = nulloverride fun onCreate(@Nullable savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)onActivityResultListener!!.onRequest(this)}override fun onActivityResult(requestCode: Int, resultCode: Int, @Nullable data: Intent?) {super.onActivityResult(requestCode, resultCode, data)onActivityResultListener!!.onActivityResult(requestCode, resultCode, data)if (activity != null) {val transaction: FragmentTransaction =requireActivity().supportFragmentManager.beginTransaction()transaction.remove(this)transaction.commit()}}interface ActivityResultListener {fun onRequest(fragment: ActivityResultFragment?)fun onActivityResult(requestCode: Int, resultCode: Int, @Nullable data: Intent?)}companion object {private const val TAG = "ActivityResultFragment"fun registerActivityResult(activity: FragmentActivity,@NonNull listener: ActivityResultListener) {val transaction: FragmentTransaction =activity.supportFragmentManager.beginTransaction()var fragment =activity.supportFragmentManager.findFragmentByTag(TAG) as? ActivityResultFragmentif (fragment == null) {fragment = ActivityResultFragment()}fragment.onActivityResultListener = listenerif (fragment.isAdded) {listener.onRequest(fragment)} else {transaction.add(fragment, TAG)}transaction.commit()}}
}interface FileUtilCallback {fun onResult(success: Boolean)
}
2、创建删除文件的工具类
object ImageUtil {/*** 删除文件* @return*/fun deleteFileUri(activity: FragmentActivity, imgPath: String, callBack: FileUtilCallback) {val cursor: Cursor = MediaStore.Images.Media.query(activity.contentResolver,MediaStore.Images.Media.EXTERNAL_CONTENT_URI,arrayOf<String>(MediaStore.Images.Media._ID),MediaStore.Images.Media.DATA.toString() + "=?",arrayOf(imgPath),null)try {if (cursor.moveToFirst()) {val id: Long = cursor.getLong(0)val contentUri: Uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URIval uri: Uri = ContentUris.withAppendedId(contentUri, id)val count: Int = activity.contentResolver.delete(uri, null, null)if (count > 0) {callBack.onResult(true)} else {callBack.onResult(false)}} else {val isSuccess = File(imgPath).delete()if (isSuccess) {callBack.onResult(true)} else {callBack.onResult(false)}}} catch (e: java.lang.Exception) {e.printStackTrace()if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && e is RecoverableSecurityException) {val DELETE_REQUEST_CODE = 1001ActivityResultFragment.registerActivityResult(activity,object : ActivityResultFragment.ActivityResultListener {override fun onRequest(fragment: ActivityResultFragment?) {try {fragment!!.startIntentSenderForResult(e.userAction.actionIntent.intentSender,DELETE_REQUEST_CODE,null,0, 0, 0, null)} catch (sendIntentException: IntentSender.SendIntentException) {sendIntentException.printStackTrace()callBack.onResult(false)}}override fun onActivityResult(requestCode: Int,resultCode: Int,@Nullable data: Intent?) {if (requestCode == DELETE_REQUEST_CODE && resultCode == Activity.RESULT_OK) {deleteFileUri(activity, imgPath, callBack)} else {callBack.onResult(false)}}})} else {callBack.onResult(false)}}}}
3、在界面中设置一个点击事件,实现删除图片功能的调用
R.id.delteimage -> {ImageUtil.deleteFileUri(requireActivity(),imagePath, //图片路径object : FileUtilCallback {override fun onResult(success: Boolean) {if (success) {ToastUtils.showBottom("删除成功")goSelectPhoto() //更新列表} else {ToastUtils.showBottom("删除失败,请手动删除")}}})
}
现在就可以实现在fragment里面 实现删除文件功能,在获取权限后自动删除该文件了
处理android11以上无法删除相册图片的问题相关推荐
- Android 不申请权限储存、删除相册图片
Android 不申请权限储存.删除相册图片 前言 最近重新看了下安卓的储存适配,并结合之前做的拍照.裁切demo,小小实验了一下.Android 6.0增加了动态文件权限申请; Android 7. ...
- Android之如何分析手机系统相册图片和视频删除后保存的位置然后恢复文件,目前已经适配小米、OPPO、VIVO、一加、努比亚、魅族等手机。
1 需求 需要获取各种型号手机系统相册图片和视频删除后保存的位置 2 分析 1)我们可以通过在sdcard目录下进行相关查找文件夹关键字,对 "cycle"或者"tras ...
- Android之如何分析手机系统相册图片和视频删除后保存的位置
1 需求 需要获取各种型号手机系统相册图片和视频删除后保存的位置 2 分析 1)我们可以通过在sdcard目录下进行相关查找文件夹关键字,对 "cycle"或者"tras ...
- 极客日报:豆瓣回应删除用户相册图片:低概率bug;传阿里平头哥校招IC岗在成都开出50万天价薪资;Qt 6.2.1正式发布
一分钟速览新闻点! <2021胡润百富榜>发布:张一鸣3400亿元跃居第二 阿里平头哥校招IC岗在成都开出50W+的天价 段永平否认重出江湖造车 豆瓣回应删除用户相册图片:低概率bug,下 ...
- 苹果手机删除的图片怎么恢复?试试这3个方法
苹果手机在使用的过程时,大家会发现自己手机相册里的图片越来越多,多到占用了自己手机非常多的内存.所以大家都会经常去清理自己苹果手机相册里的图片,在清理图片的时候大家或多或少都会不小心把一些重要的图片给 ...
- 应用中删除iCloud照片或视频 删除相册照片或视频
可通过UIImagePickerController获取到相册图片后删除系统相册或iCloud照片(视频可同样操作) 见下代码 导入头文件 #import <Photos/Photos.h> ...
- indesign选中不了图片删除_图片神器XnView教程、方法和技巧汇总
编者按 关于XnView的介绍和概况参阅<「神级图片软件 XnView 解析」XnView MP 和 XnView 哪个好>. 在写完上面这篇文章之后,想整理一些方法和技巧给不太熟悉XnV ...
- 华为荣耀8x云相册不见了_华为手机相册图片凭空消失
华为手机相册图片凭空消失,一起来了解一下华为手机相册图片凭空消失怎么回事吧. 1. 手机中存在 .nomedia文件,导致图片不显示 原因: Android原生设计是当目录存在 .nomedia文件时 ...
- android删除本地图片,Android之删除图库照片
相关文章:Android手机读取相册图片,根据URI获取图片路径 从图库获取的Uri:content://media/external/images/media/20782 Uri uri = dat ...
最新文章
- php 列出当前目录
- 计算机系统结构广义定义,《计算机系统结构》电子教案(清华版).ppt.ppt
- (2)MongoDB副本集自动故障转移原理(含客户端)
- git 命令详解和常见问题解决
- java中的foreach
- c 语言编写脚本优化,两周自制脚本语言-第11天 优化变量读写性能
- .NET2.0中,Winform程序如何异步调用Web Service呢?[Demo下载]——与.net1.1环境下比较...
- vnpy 量化交易系统 源码分析 v0.01
- 《Spring实战(第四版)》pdf
- win10和ubuntu双系统下彻底删除ubuntu系统和grub引导
- Pandas[加深学习]01-pandas基本数据结构
- 如何在服务器查看文件,如何在服务器地址上查看文件夹
- 12-Gateway新一代网关
- vs2013 编译 该文件已在源编辑器之外被修改
- C++HANDLE的理解
- 955.WLB 红包封面来啦!送给希望不加班的你~
- 达芬奇设置渲染的入点和出点
- ViewPage禁止滑动原理解析
- 2018年考研真题计算机专业,2018年合肥工业大学计算机考研真题及答案
- 电话机器人的技术分析