我正在使用MediaStore。图像。媒体EXTERNAL_CONTENT_URI与MediaStore上的筛选器。媒体列。DATA和游标来检索图像。我需要保留存储图像的图像路径(位于子文件夹中(,因为我使用图像路径来找到正确的图像,以便将它们与其父库存项目一起显示。除了使用MediaStore,我尝试了很多不同的方法,但都没有成功。这是有效的。问题是;MediaStore。MediaColumn。DATA已弃用(叹气(。因此,我需要重构掉不推荐使用的字段。
这是一个库存应用程序,其中每个库存项目都有一个";Source"订单号"OrderItemNumber;加上其他数据。我把sdCard上的图像存储在我在";下载";称为";InventoryImages";。此文件夹下有子文件夹(实际来源名称(、(实际订单号(和(实际订单项目号(。在";OrderItemNumber;文件夹中有几个图像,都是针对这个特定组合的。
Inventory Item数据存储在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();
}
}
这很有效:
public ArrayList<File> getItemInventoryImages(String sourceSpecificPath)
{
String sourcePath = Environment.getExternalStorageDirectory().toString() + "/Download/" + sourceSpecificPath;
File file = new File(sourcePath);
if(!file.isDirectory()) {return null;}
if(!file.canRead() {return null;}
File[] files = file.listFiles();
return files;
}
现在我可以将File数组提供给Adapter,并使用Glide来显示它们。