微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

安卓 |什么是 MediaStore.MediaColumns.DATA 替换?

如何解决安卓 |什么是 MediaStore.MediaColumns.DATA 替换?

我正在使用 MediaStore 获取 absoluteImagePaths 并将其提供给适配器类中的 Glide。 目前我正在使用 MediaStore.MediaColumns.DATA获取路径。但是,最近谷歌弃用了该 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,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. 我尝试点击此链接 MediaStore.MediaColumns.DATA is deprecated,and I want to load images from gallery to my app,但是找不到适合我的特定代码的替代品。 此链接建议使用 MediaStoroe.Images.Media._ID 并稍作调整。但是,这种调整使 Uri 不是绝对路径。我的代码需要生成 absoluteImagePath 才能提供给 Glide
  3. 然后,我尝试通过此链接 Get filename and path from URI from mediastorepath 获取 Uri,但是,这让我再次MediaStore.MediaColumns.DATA
  4. 我也尝试过谷歌,但似乎我也需要更改其他一些类才能使用 MediaStore.Images.Media._ID

注意:

  1. 我有 ImageModel 类到 getset path 个图像。
  2. 我有 Adapter 类,方法 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);
}
...

GlideMethod

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

在 ImageModel 类中添加方法

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

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

现在将加载 uri 而不是路径。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。