在Android 11中删除文件



在用户同意的情况下,我正在尝试删除文件(照片,视频,音频)。但是当我试图打开用户协议窗口时,我得到了一个错误。由于某些原因,我的Uri变量不适合

我代码:

if (Build.VERSION.SDK_INT >= 30) {
val collection: ArrayList<Uri> = ArrayList()
for (i in 0 until Params.dataListPath.size) {
collection.add(Params.dataListPath[i].file.path.toUri())
Log.d(TAG, "onShowDialogConfirmDelete: " + collection[i].path)
}
val  pendingIntent = MediaStore.createDeleteRequest(requireActivity().contentResolver, collection).intentSender
startIntentSenderForResult(pendingIntent, 100, null, 0, 0, 0, null)
}

异常:

java.lang.IllegalArgumentException: All requested items must be referenced by specific ID
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:172)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:142)
at android.content.ContentProviderProxy.call(ContentProviderNative.java:732)
at android.content.ContentResolver.call(ContentResolver.java:2433)
at android.provider.MediaStore.createRequest(MediaStore.java:834)
at android.provider.MediaStore.createDeleteRequest(MediaStore.java:997)
at com.test.cleanerapp.duplicate_files.view.fragment.DuplicateFindFragment.onShowDialogConfirmDelete(DuplicateFindFragment.kt:119)

删除Android 11及以上版本的文件和更少的

new的解决方案旧和版本MediaStore

步骤:

  1. 追加指定id media.
  2. 创建请求删除权限并发送
  3. 在权限对话框中按下允许按钮后的
  4. 。你可以倾听

如何调用方法我使用MediaStoreM模型将_id和路径媒体添加为列表

String path="/storage/emulated/0/Download/Video/nameVideoFile.mp4";
//or
//path="/storage/2332-4883/EveryThing/nameAudioFile.mp3";
int id =get_Id_MediaByPath(mContext,path);
List<MediaStoreM> list=new ArrayList<>();
list.add(new MediaStoreM(id,path));
deleteMediaStore(mContext, list);


//1
public void deleteMediaStore(Context mContext, List<MediaStoreM> list) {
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {//SDK>=30
List<Uri> listRequest = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
if (new File(list.get(i).getPath()).exists()) {
Uri uriRequest = ContentUris.withAppendedId(get_Files_media_uri(), list.get(i).getId());
listRequest.add(uriRequest);
}
}
requestDeletePermission(mContext, listRequest);
} else {//SDK<=29
for (MediaStoreM m : list) {
File file = new File(m.getPath());
if (file.exists())
file.delete();
}
}
} catch (Exception e) {
Log.i("zakaria_mediaD","   mediaDelete error:n"+e.getMessage());
}
}
//2
private Uri get_Files_media_uri() {
//MediaStore.Audio.Media.. or MediaStore.Video.Media... is same value but title of permission dialog deference. as Audio or video you can do
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
return MediaStore.Audio.Media.getContentUri(MediaStore.VOLUME_EXTERNAL);
else
return MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}

private int get_Id_MediaByPath(Context mContext,String path) {
Cursor cursor=mContext.getContentResolver().query(get_Files_media_uri(),new String[]{"_id"}
,"_data=?",new String[]{path},null);
if (cursor.getCount()>0){
return cursor.getInt(0);
}else return 0;
}

//3 requestDeletePermissio
private static final int REQUEST_PERM_DELETE = 8;
@RequiresApi(api = Build.VERSION_CODES.R)
public void requestDeletePermission(Context context, List<Uri> uri_list) {
try {
PendingIntent editPendingIntent = MediaStore.createDeleteRequest(context.getContentResolver(), uri_list);
startIntentSenderForResult(editPendingIntent.getIntentSender(), REQUEST_PERM_DELETE, null, 0, 0, 0);
} catch (IntentSender.SendIntentException e) {
Log.i("zakaria_mediaD","   requestDeletePermission error:n"+e.getMessage());
}
}

//5 process done
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable @org.jetbrains.annotations.Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case REQUEST_PERM_DELETE:
if (resultCode == Activity.RESULT_OK) {
Toast.makeText(yy_MusicApp.this, "Deleted successfully! Refreshing...", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(yy_MusicApp.this, "Failed to delete!", Toast.LENGTH_SHORT).show();
}
break;
}
}

create Model Class "MediaStoreM.java">

public class MediaStoreM {

private int id;
private String path;
public MediaStoreM(int id, String path){
this.id=id;
this.path=path;
//..
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
}