【问题标题】:Get path of DCIM folder on both primary and secondary storage获取主存储和辅助存储上 DCIM 文件夹的路径
【发布时间】:2015-04-11 09:10:33
【问题描述】:

我正在编写一个应用程序,它应该上传相机拍摄的照片,这些照片存储在内部存储器和 SD 卡上的 DCIM/Camera 文件夹中。

这意味着在每次上传之前,必须检查所有可用存储是否存在任何图像。

我使用Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) 访问主存储,可以是 SD 卡或内部存储器(取决于设备)。

来自文档:

注意:不要被这里的“外部”一词所迷惑。最好将此目录视为媒体/共享存储。它是一个文件系统,可以保存相对大量的数据,并且在所有应用程序之间共享(不强制执行权限)。传统上这是一张 SD 卡,但它也可以作为设备中的内置存储实现,不同于受保护的内部存储,并且可以作为文件系统安装在计算机上。

我的问题是,如何在不硬编码路径的情况下访问辅助存储以检查 DCIM/Camera 文件夹中是否存在图像,因为 SD 卡可能在不同的路径中模拟,所以效果不佳。

【问题讨论】:

  • 访问权限一如既往。独立于路径。我认为您想要的是在外部和可移动媒体上找到 DCIM 文件夹的路径。

标签: android


【解决方案1】:

试试这个代码来选择最后使用的 DCIM/Camera 文件夹。

String getDCIMCamera() {
    try {
        String[] projection = new String[]{
                MediaStore.Images.ImageColumns._ID,
                MediaStore.Images.ImageColumns.DATA,
                MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME,
                MediaStore.Images.ImageColumns.DATE_TAKEN,
                MediaStore.Images.ImageColumns.MIME_TYPE};

        Cursor cursor = getContentResolver().query(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                projection,
                null,
                null,
                MediaStore.Images.ImageColumns.DATE_TAKEN + " DESC");
        if (cursor != null) {
            cursor.moveToFirst();
            do {
                String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
                if (path.contains("/DCIM/")) {
                    File file = new File(path);
                    path = file.getParent();
                    cursor.close();
                    return path;
                }
            } while (cursor.moveToNext());
            cursor.close();
        }
    }
    catch (Exception e) {
    }
    return "";
}

另请参阅@Pedram 提示:https://stackoverflow.com/a/24189813/966789

【讨论】:

    【解决方案2】:

    getExternalStorageDirectory 仅从内部存储数据中检索,而不从辅助存储图像中检索

    这是我们从android获取二级存储图像或从二级存储访问的任何文件夹的方式这是代码......

    String secStore = System.getenv("SECONDARY_STORAGE");
    File file = new File(secStore + "/DCIM");
    File[] listFiles = file.listFiles();
    

    【讨论】:

    • 这是我设备上的错误,file.toString();将产生“/storage/extSdCard:/storage/UsbDriveA:/storage/UsbDriveB:/storage/UsbDriveC:/storage/UsbDriveD:/storage/UsbDriveE:/storage/UsbDriveF/DCIM”
    • 文件[] aDirArray = ContextCompat.getExternalFilesDirs(MyService.this, null);文件路径 = new File(String.valueOf(aDirArray[z]), Environment.DIRECTORY_DCIM);字符串数据 = path.toString(); int index = data.indexOf("Android");字符串子数据 = data.substring(0, index);文件秒=新文件(子数据+“DCIM”); File[] dataFiles = sec.listFiles();
    【解决方案3】:

    试试

    File[] aDirArray = ContextCompat.getExternalFilesDirs(context, null);
    

    参见 http://developer.android.com/reference/android/support/v4/content/ContextCompat.html#getExternalFilesDirs(android.content.Context, java.lang.String)

    请记住,外部存储(SD 卡)不是模拟的,所有用户都可以看到所有路径。

    返回值

    • null - 失败时
    • 每个挂载的外部存储的根路径(文件)

    所以如果aDirArray.length > 1,那么以下内容将为您提供您在可移动存储上寻找的 DCIM 路径。

    File aExtDcimDir = new File(aDirArray[1], Environment.DIRECTORY_DCIM);
    

    也许在您的情况下,您想检查aDirArray[0]aDirArray[1]、...(数组中返回的所有文件)是否存在Environment.DIRECTORY_DCIM

    【讨论】:

    • 遗憾的是 getExternalFilesDirs 在许多 KitKat 设备上只返回一项。与 getExternalFileDir() 返回的相同。 external storage (SD Card) 。不可以。微型 SD 卡是可移动存储。外部存储与它无关。
    • 正如您在答案末尾所说,这是我在手机(棒棒糖)上测试的不同路径。新文件(aDirArray[0], Environment.DIRECTORY_DCIM).toString();将返回“/storage/sdcard0/Android/data/com.myapp.something/files/DCIM”。而 Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).toString();将返回“/storage/sdcard0/DCIM”
    • ContextCompat.getExternalFilesDirs与DCIM等公共媒体文件夹无关,请查看stackoverflow.com/questions/68808504/…
    • Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)File(aDirArray[0], Environment.DIRECTORY_DCIM) 不同!!!
    【解决方案4】:
    文件[] aDirArray = ContextCompat.getExternalFilesDirs(SDCardExample.this, null);
            文件路径 = new File(aDirArray[1], Environment.DIRECTORY_DCIM);
            字符串数据=path.toString();
            int index=data.indexOf("Android");
            字符串子数据=data.substring(0,index);
            File sec=new File(subdata+"DCIM/Camera");
            文件[] secs=sec.listFiles();
    
    

    【讨论】:

    • 上述逻辑将检索任何模型的二级存储
    【解决方案5】:
    File[] aDirArray = ContextCompat.getExternalFilesDirs(MainActivity.this, null);
    File path = new File(aDirArray.length>1?aDirArray[1]:aDirArray[0], Environment.DIRECTORY_DCIM);
    

    就像戴夫·特鲁比写的那样

    【讨论】:

      【解决方案6】:

      这里是解决方案。 试试看……

      首先获取列表中的所有文件

      var file=new Java.IO.File("storage/");
      var listOfStorages=file.ListFiles();
      
      var isSDPresent=false;
      if(listOfStorages[1].Name.Containes("emulated")||listOfStorages[0].Name.Containes("-"))
      {
         isSDPresent=true;
         var sdCardName=listOfStorages[0].Name;
      }
      

      有效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-05
        • 1970-01-01
        • 1970-01-01
        • 2011-07-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多