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