Android 11调用createDeleteRequest后如何在onActivityResult处理删除逻辑
解决方案
你需要先暂存待删除条目的位置和对应信息,再在onActivityResult中根据用户授权结果执行后续逻辑,具体实现如下:
1. 先定义常量和临时存储变量
在你的Activity/Fragment类中添加以下声明,避免硬编码请求码,同时暂存待删除的信息:
// 自定义删除请求的请求码 private static final int REQUEST_DELETE_VIDEO = 1001; // 暂存待删除的条目位置 private int mPendingDeletePosition = -1;
2. 修改原有删除逻辑
在触发Android 11+删除请求前,先保存待删除的条目位置:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { // 保存当前要删除的条目位置,后续回调要用 mPendingDeletePosition = p; PendingIntent demande = MediaStore.createDeleteRequest(context.getContentResolver(), fichiers); try { ((Activity) context).startIntentSenderForResult(demande.getIntentSender(),REQUEST_DELETE_VIDEO,new Intent(), 0,0,0); } catch (IntentSender.SendIntentException e) { e.printStackTrace(); } }
3. 重写onActivityResult处理回调
在宿主Activity/Fragment中重写该方法,根据用户操作结果执行UI和数据更新:
@Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); // 匹配删除请求的请求码 if (requestCode == REQUEST_DELETE_VIDEO) { // 用户同意删除 if (resultCode == RESULT_OK) { // 执行原有删除成功后的逻辑 videoFolder.remove(mPendingDeletePosition); notifyItemRemoved(mPendingDeletePosition); notifyItemRangeChanged(mPendingDeletePosition, videoFolder.size()); Snackbar.make(view, "Fichier supprimé avec succès", Snackbar.LENGTH_SHORT).show(); } // 用户拒绝删除 else { Snackbar.make(view, "Erreur, le fichier n'a pas été supprimé", Snackbar.LENGTH_SHORT).show(); } // 重置临时变量,避免后续复用出现数据错乱 mPendingDeletePosition = -1; } }
注意事项
- 如果删除逻辑写在列表Adapter中,建议自定义回调接口将删除操作和结果处理抛给宿主Activity/Fragment实现,不要在Adapter中持有临时变量,避免内存泄漏和数据异常。
- 重命名逻辑和删除逻辑一致,调用
MediaStore.createWriteRequest()获取权限后,同样在onActivityResult中匹配自定义请求码执行后续操作即可。
内容的提问来源于stack exchange,提问作者Armczbt
相关产品推荐
相关产品推荐

