【问题标题】:Retrieving images that I manually copied to phone/emulator from windows desktop检索我从 Windows 桌面手动复制到手机/模拟器的图像
【发布时间】: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


【解决方案1】:

这行得通:

  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 显示它们。

【讨论】:

  • 冬青牛,Environment.getExternalStorageDirectory 已弃用。文档将我指向 MediaStore 提供程序。我要做的就是获得一个非常简单的目录列表,其中包含存储在已知路径中的图像文件。为什么在 Android 中如此困难?我知道路径。我不知道该位置有多少文件,也不知道文件名。这不是使用 Uri 或字符串的问题。我只需要一个 Android 函数来获取每个图像文件的文件名。加载图像文件不是问题。获取图像文件名列表是个问题。
  • 对这一切感到抱歉。我真正需要的是一个常量或方法来获取设备 SD 卡下载的 Uri 或路径。我现在知道它是什么,但是硬编码它有多安全?
  • 真是个兔子洞。 :-) stackoverflow.com/questions/5858107/…
  • 我发布的链接并声明它仅适用于模拟器。是在android设备上找到存储卡的目录路径绝密还是什么?这就是我所需要的。查找 SD 卡的路径。有人能帮忙吗?我花了数百个小时搜索和尝试发布的不同方法。唯一的工作已被弃用。有没有不被弃用的方法?请帮忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-07
  • 1970-01-01
  • 1970-01-01
  • 2011-06-29
  • 1970-01-01
相关资源
最近更新 更多