java.lang.IllegalArgumentException:所有请求的项目必须由特定 ID 引用(Android)

Fer*_*han 0 storage android mediastore android-10.0 android-11

我在调用时收到此异常MediaStore.createWriteRequest(contentResolver, uris)。与 Anrdroid Q 及以上版本一样,我们必须使用 createWriteRequest 来写入存储。所以我正在尝试以下代码并得到异常。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            List<Uri> uris = new ArrayList<>();
            uris.add(mediaUri);
            MediaStore.createWriteRequest(contentResolver, uris);
            //code
        }
Run Code Online (Sandbox Code Playgroud)

Jat*_*iya 6

您的 Uri 路径错误,这就是显示错误消息的原因。

无效的 Uri 路径: content://com.abc.photoapp.provider/external_files/emulated/0/Pictures/camara/1623819097267.jpg

有效路径是: content://media/external/images/media/52703

这里,我一步一步解释删除媒体的文件路径。

步骤1:

假设您有一个像这样的文件路径“/storage/emulated/0/tempPic/export_image.jpg”

File tempFile=new File("/storage/emulated/0/tempPic/export_image.jpg");
long mediaID=getFilePathToMediaID(tempFile.getAbsolutePath(),  context);

public long getFilePathToMediaID(String songPath, Context context)
{
        long id = 0;
        ContentResolver cr = context.getContentResolver();

        Uri uri = MediaStore.Files.getContentUri("external");
        String selection = MediaStore.Audio.Media.DATA;
        String[] selectionArgs = {songPath};
        String[] projection = {MediaStore.Audio.Media._ID};
        String sortOrder = MediaStore.Audio.Media.TITLE + " ASC";

        Cursor cursor = cr.query(uri, projection, selection + "=?", selectionArgs, null);

        if (cursor != null) {
            while (cursor.moveToNext()) {
                int idIndex = cursor.getColumnIndex(MediaStore.Audio.Media._ID);
                id = Long.parseLong(cursor.getString(idIndex));
            }
        }

        return id;
}
Run Code Online (Sandbox Code Playgroud)

第2步:

创建 Uri 媒体 ID

Uri Uri_one = ContentUris.withAppendedId( MediaStore.Images.Media.getContentUri("external"),mediaID);

// content://media/external/images/media/52703
Run Code Online (Sandbox Code Playgroud)

内容 Uri 根据您的文件类型而变化:

如果是图像,则: MediaStore.Images.Media.getContentUri("external") 如果是视频,则: MediaStore.Video.Media.getContentUri("external")

步骤3:

准备并调用删除

List<Uri> uris=new ArrayList<>();
uris.add(<Add Paht : Uri_one >);
uris.add(<Add Paht : Uri_two >);
uris.add(<Add Paht : Uri_three >);

requestDeletePermission( context,uris);
Run Code Online (Sandbox Code Playgroud)

在此处输入图像描述 调用该方法后询问权限对话框。requestDeletePermission 方法是 onActivityResult 方法的返回结果。

上述方法支持android 11(Target SDK Version 30)及更高版本。您不需要管理外部存储权限即可删除媒体文件。您可以使用视频、音频和图像等媒体。

如果你想删除一个文档文件那么你必须需要manage_external_storage权限。