检索我从 Windows 桌面手动复制到手机/模拟器的图像

问题描述

我使用 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();
        }
    }

解决方法

这有效:

  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 数组提供给适配器并使用 Glide 来显示它们。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...