安卓|什么是MediaStore.媒体列.数据替换



我正在使用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, 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。媒体列。DATA已被弃用,我想将图片从库加载到我的应用程序中,但我找不到合适的替代品来替换我的特定代码。这个链接建议使用带有一些小调整的MediaStoroe.Images.Media._ID。但是,这种调整给了一个Uri不是绝对的路径。并且我的代码需要生成absoluteImagePath以提供给Glide
  3. 然后,我试图按照这个链接从Uri中获取path。从媒体存储的URI中获取文件名和路径,但它再次导致我使用MediaStore.MediaColumns.DATA
  4. 我也试过谷歌,但似乎我也需要更改其他一些类才能使用MediaStore.Images.Media._ID

注意:

  1. 我有ImageModel类到图像的getsetpath
  2. 我有方法为onBindViewHolderAdapter类,其中包含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类中添加了方法

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

这将加载uri而不是路径。

最新更新