首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java.lang.IllegalArgumentException:所有请求的项目都必须由特定的ID (Android)引用

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

Stack Overflow用户
提问于 2020-10-21 22:48:47
回答 1查看 3.3K关注 0票数 0

我在打电话给MediaStore.createWriteRequest(contentResolver, uris)时得到了这个异常。与Anrdroid及以上版本一样,我们必须使createWriteRequest在存储上写入。所以我正在尝试下面的代码并得到异常。

代码语言:javascript
复制
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            List<Uri> uris = new ArrayList<>();
            uris.add(mediaUri);
            MediaStore.createWriteRequest(contentResolver, uris);
            //code
        }
EN

Stack Overflow用户

发布于 2021-06-22 07:09:30

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

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

有效路径是:内容://media///52703

在这里,我解释了文件路径一步一步删除媒体.

步骤1:

假设您有一个类似于这个"/storage/emulated/0/tempPic/export_image.jpg“的文件路径

代码语言:javascript
复制
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;
}

步骤2:

将媒体id创建为Uri

代码语言:javascript
复制
Uri Uri_one = ContentUris.withAppendedId( MediaStore.Images.Media.getContentUri("external"),mediaID);

// content://media/external/images/media/52703

内容Uri根据文件类型更改:

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

步骤3:

准备并调用删除

代码语言:javascript
复制
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);

调用方法ask权限对话框后的在这里输入图像描述。requestDeletePermission方法是onActivityResult方法的返回结果。

上述方法支持android 11 (Target版本30 )和更高版本。媒体文件删除不需要manage_external_storage权限。您可以使用媒体,如视频、音频和图像。

如果要删除文档文件,则必须获得manage_external_storage权限。

票数 3
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64472765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档