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

在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<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_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里面 实现删除文件功能,在获取权限后自动删除该文件了

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值