处理android11以上无法删除相册图片的问题 您所在的位置:网站首页 安卓机器人死了图片删不掉了 处理android11以上无法删除相册图片的问题

处理android11以上无法删除相册图片的问题

2024-07-15 13:31| 来源: 网络整理| 查看: 265

在android11手机上,当APP重新安装后,无法删除之前在APP上保存的图片,是因为没有app没有修改这张图片的权限,所以需要重新手动申请权限,先上图: 请添加图片描述

功能代码实现: 1、创建一个fragment,用于处理fragment 的回调信息。如果是activity的话,直接在 onActivityResult处理就可以了

class ActivityResultFragment : Fragment() { private var onActivityResultListener: ActivityResultListener? = null override 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? ActivityResultFragment if (fragment == null) { fragment = ActivityResultFragment() } fragment.onActivityResultListener = listener if (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(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_URI val 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 = 1001 ActivityResultFragment.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里面 实现删除文件功能,在获取权限后自动删除该文件了



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有