【发布时间】:2021-06-11 00:58:22
【问题描述】:
我正在使用 MediaStore.Images.Media.EXTERNAL_CONTENT_URI 和 MediaStore.MediaColumns.DATA 上的过滤器和 Cursor 来检索图像。我需要保留存储图像的图像路径(位于子文件夹中),因为我正在使用图像路径来查找正确的图像以将它们与其父库存项目一起显示。除了使用 MediaStore,我尝试了许多不同的方法,但都没有成功。这是有效的。问题是; MediaStore.MediaColumn.DATA 已弃用(叹气)。所以我需要重构已弃用的字段使用。
这是一个库存应用程序,其中每个库存项目都有一个“来源”、“订单号”、“订单项目号”以及其他数据。我将 sdCard 上的图像存储在我在“下载”下创建的名为“InventoryImages”的文件夹中。在此文件夹下是子文件夹(实际来源名称)、(实际订单号)、(实际订单项目号)。 “OrderItemNumber”文件夹中有几张图片,都是针对这种特定组合的。
库存项目数据存储在 sqlite 数据库中。 ((预装)(在维修件上工作))。但我真的想避免将图像(blob)存储在数据库中。但我愿意接受任何和所有关于替代方案的建议。如果应用程序被卸载,我宁愿不要删除图像。我目前有 104 个库存商品,每个商品平均有 4 张图片。
同样,包含的片段正在工作,我只需要一个替代 DATA 列的值是图像路径。
片段:
public class ListViewFragment extends Fragment
implements IAdapterCallback
{
public ArrayList<ImageInfo> getAllMediaStoreImages()
{
ArrayList<ImageInfo> allImages = new ArrayList<>();
String inventoryDirectory;
if(Build.FINGERPRINT.contains("generic"))
inventoryDirectory = "Inventory"; // <-- use this for the emulator
else
inventoryDirectory = "InventoryImages"; // <-- use this for my phone
Uri uri =
MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
String selection =
MediaStore.MediaColumns.DATA + " LIKE ? ";
String[] selectionArgs = new String[]{"%" +
inventoryDirectory + "%"};
Cursor cursor =
this.getActivity().getContentResolver().query(uri,
null, selection, selectionArgs, null);
String[] names = cursor.getColumnNames();
try {
if (cursor != null) {
while (cursor.moveToNext())
{
String filePath =
cursor.getString(cursor.getColumnIndex((MediaStore.MediaColumns.*DATA*)));
String fileName =
cursor.getString(cursor.getColumnIndex((MediaStore.MediaColumns.TITLE)));
int inventoryDirectoryLoc =
filePath.indexOf(inventoryDirectory) +
inventoryDirectory.length() + 1;
String matchPath =
filePath.substring(inventoryDirectoryLoc,
filePath.lastIndexOf('/'));
allImages.add(new
ImageInfo(filePath, fileName, matchPath));
}
}
return allImages;
}
catch (Exception x)
{
x.printStackTrace();
return null;
}
finally
{
if(cursor != null)
cursor.close();
}
}
【问题讨论】:
-
你没有说明为什么你需要一个文件系统路径,其他人只会使用 uri 来访问图像文件。
-
blackapps,我需要从我可以创建的 Uri 路径中获取列表(文件名)(减去文件名)。我知道图像文件的路径,但我不知道会有多少文件或文件名是什么。但是现在,我认为我不需要使用 DATA 列,因此我将尝试仅使用具有文件名的 TITLE 列。有没有更好的方法从我可以创建的 Uri 中获取文件名,它适用于 minSdkVersion 28?感谢您让我朝着正确的方向前进。我有安卓脑雾。我将继续这种方式,而不使用已弃用的 MediaStore Column DATA
-
这似乎是我需要的: public ArrayList
getItemInventoryImages(String sourceSpecificPath) { String fullPath = Environment.getExternalStorageDirectory().toString() + "/Download/" + sourceSpecificPath;文件文件 = 新文件(完整路径); if(!file.isDirectory()) {return null;} if(!file.canRead() {return null;} File[] files = file.listFiles(); return files; }
标签: android image mediastore deprecation-warning shared-directory