Android |什么是 MediaStore.MediaColumns.DATA 替换?

Android | What is MediaStore.MediaColumns.DATA Replacement?

我正在使用 MediaStore 获取 absoluteImagePaths 并将其提供给适配器 class 中的 Glide。 目前我正在使用 MediaStore.MediaColumns.DATA 来获取路径。但是,最近 google 弃用了 api 并且在不久的将来可能无法使用。那么,这个的替代品是什么?

...
uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
        String[] projection = {
                MediaStore.MediaColumns.DATA,
                MediaStore.Images.Media._ID
        };

        String orderBy = MediaStore.Images.Media.DEFAULT_SORT_ORDER;

        cursor = getApplicationContext().getContentResolver().query(uri, projection, null, null, orderBy + " DESC");

        column_index_data = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA);

        
            cursor.moveToFirst();
            while (cursor.moveToNext()) {
                String absoluteImagePath = cursor.getString(column_index_data);
                ImageModel ImageModel = new ImageModel();
                ImageModel.setPath(absoluteImagePath);
                arrayList.add(ImageModel);
            }
...

这段代码给出了绝对路径。然后它被馈送以在 arrayList 中滑动。

尝试过的解决方案

  1. 我尝试使用 MediaStore.Images.Media._ID 但它没有用。
  2. 我尝试遵循此 link MediaStore.MediaColumns.DATA is deprecated, and I want to load images from gallery to my app 但是,我找不到适合我的特定代码的替代品。 link 建议使用 MediaStoroe.Images.Media._ID 并稍加调整。但是,这个调整给了一个 Uri 而不是绝对路径。我的代码需要生成 absoluteImagePath 以提供给 Glide.
  3. 然后我尝试在 link Get filename and path from URI from mediastore 之后从 Uri 获取 path 但是,它又导致我 MediaStore.MediaColumns.DATA.
  4. 我也尝试了 google 但是,似乎我也需要更改其他一些 classes 才能使用 MediaStore.Images.Media._ID

注:

  1. 我有 ImageModel Class 到 getset path 的图像。
  2. 我有 Adapter Class 方法 onBindViewHolder 其中包含 Glide 方法
...
Glide.with(context)
                .load("file://" + arrayList.get(position).getPath())
                .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
                .into(holder.img);
...

在 Kotlin 中使用这个:

 val contentUri: Uri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,id)                                     
 Glide.with(context).load(contentUri).into(holder.img);

正如@SaurabhDhage 提到的...我调整了代码并得出了这个工作代码。这可能在任何地方都可用,但我将其发布以供将来参考。也许有人可以从中得到帮助。

里面MainActivity.java

...
while (cursor.moveToNext()) {
                long imageId = cursor.getLong(column_index_data);
                Uri uriImage = Uri.withAppendedPath(uri, "" + imageId);
                ImageModel ImageModel = new ImageModel();
                ImageModel.setUri(uriImage);
                arrayList.add(ImageModel);
}
...

滑行法

...
GlideApp.with(context)
                //.load("file://" + arrayList.get(position).getUri())
                .load(arrayList.get(position).getUri())
                .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
                .into(holder.img);
...

在 ImageModel 中添加了方法 class

...
public Uri getUri() {
        return uri;
    }

    public void setUri(Uri uri) {
        this.uri = uri;
    }
...

这将加载 uris 而不是路径。