【问题标题】:Android | What is MediaStore.MediaColumns.DATA Replacement?安卓 |什么是 MediaStore.MediaColumns.DATA 替换?
【发布时间】:2021-06-12 07:39:06
【问题描述】:

我正在使用MediaStore 获取absoluteImagePaths 并将其提供给适配器类中的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. 我尝试点击此链接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 mediastoreUri 获取path,但是,它又导致我再次访问MediaStore.MediaColumns.DATA
  4. 我也尝试了 google,但似乎我也需要更改其他一些类才能使用 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);
...

【问题讨论】:

  • But, this tweaks gives an Uri 是的。使用 uri。从模型中删除 .setPath() 并添加 .setUri(uri)。然后像 Saurabh 向您展示的那样从 uri 加载。
  • 我做到了。它奏效了。谢谢。但是,现在我尝试了一些新的东西并遇到了一些问题。 stackoverflow.com/questions/67949336/… 请访问此链接。

标签: android uri media android-glide mediastore


【解决方案1】:

在 Kotlin 中使用这个:

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

【讨论】:

  • 嘿,我跟着这个,转换成java,它工作。但是,我尝试了一些新的东西并遇到了一些问题。你觉得你能帮助我吗? stackoverflow.com/questions/67949336/… 请点击此链接回答我的问题。
【解决方案2】:

正如@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 类中添加的方法

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

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

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

【讨论】:

    猜你喜欢
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 2016-06-26
    相关资源
    最近更新 更多