【问题标题】:How to get path to Storage directory in android如何在android中获取存储目录的路径
【发布时间】:2015-08-18 05:30:20
【问题描述】:

有什么方法可以获取/storage/ 目录。我尝试使用Environment.getExternalStorageDirectory() 但它返回/storage/emulated/0 我知道我可以使用file.getParent() 但由于某种原因我不能使用它。我只想要使用某些功能的/storage/ 目录的直接路径...在此先感谢。

【问题讨论】:

    标签: android android-file


    【解决方案1】:

    您不能也不应该正常访问该目录。但您似乎需要对设备可用的存储位置进行更多控制。

    为此,您可以使用它,

    public List<String> getStorageDirectories() {
    
            // Final set of paths
            final ArrayList<String> finalPaths = new ArrayList<String>();
    
            // Must add the ROOT directory
            finalPaths.add("/");
    
            // Primary physical SD-CARD (not emulated)
            final String rawExternalStorage = System.getenv("EXTERNAL_STORAGE");
    
            // All Secondary SD-CARDs (all exclude primary) separated by ":"
            final String rawSecondaryStoragesStr = System.getenv("SECONDARY_STORAGE");
    
            // Primary emulated SD-CARD
            final String rawEmulatedStorageTarget = System.getenv("EMULATED_STORAGE_TARGET");
    
            if (TextUtils.isEmpty(rawEmulatedStorageTarget)) {
    
                // Device has physical external storage; use plain paths.
                if (TextUtils.isEmpty(rawExternalStorage)) {
    
                    // EXTERNAL_STORAGE undefined; falling back to default.
                    finalPaths.add("/storage/sdcard0");
                } else {
                    finalPaths.add(rawExternalStorage);
                }
            } else {
    
                // Device has emulated storage; external storage paths should have
                // userId burned into them.
                final String rawUserId;
                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
                    rawUserId = "";
                } else {
    
                    final String path = Environment.getExternalStorageDirectory().getAbsolutePath();
                    final String[] folders = DIR_SEPARATOR.split(path);
                    final String lastFolder = folders[folders.length - 1];
                    boolean isDigit = false;
                    try {
                        Integer.valueOf(lastFolder);
                        isDigit = true;
                    } catch (NumberFormatException ignored) {
                    }
                    rawUserId = isDigit ? lastFolder : "";
                }
                // /storage/emulated/0[1,2,...]
                if (TextUtils.isEmpty(rawUserId)) {
                    finalPaths.add(rawEmulatedStorageTarget);
                } else {
                    finalPaths.add(rawEmulatedStorageTarget + File.separator + rawUserId);
                }
            }
            // Add all secondary storages
            if (!TextUtils.isEmpty(rawSecondaryStoragesStr)) {
                // All Secondary SD-CARDs splited into array
                final String[] rawSecondaryStorages = rawSecondaryStoragesStr.split(File.pathSeparator);
                Collections.addAll(finalPaths, rawSecondaryStorages);
            }
    
            File usb = getUsbDrive();
    
            if (usb != null && !finalPaths.contains(usb.getPath()))
                finalPaths.add(usb.getPath());
    
            return finalPaths;
        }
    

    这是将 USB 驱动器连接到您的设备的方法,

    public File getUsbDrive() {
            File parent;
            parent = new File("/storage");
    
            try {
                for (File f : parent.listFiles()) {
                    if (f.exists() && f.getName().toLowerCase().contains("usb") && f.canExecute()) {
                        return f;
                    }
                }
            } catch (Exception e) {
            }
            parent = new File("/mnt/sdcard/usbStorage");
            if (parent.exists() && parent.canExecute())
                return (parent);
            parent = new File("/mnt/sdcard/usb_storage");
            if (parent.exists() && parent.canExecute())
                return parent;
    
            return null;
        }
    

    但请记住,这不是官方方式,而是一种黑客攻击,因此使用它需要您自担风险。

    【讨论】:

    • 'finalPaths.add("/storage/sdcard0");'如果一切都失败了,为什么这会有效? '所有 USB 驱动器'。那只会给一个。在某些设备中,它们位于 /mnt 下。
    • @greenapps 如前所述,这是一个 hack,不保证适用于所有设备。如果有一些官方的方法,我们会很幸运。
    • 您忘记使用 getExternalFileDirs()。目录!并且从 USB 中您不会全部交付。
    猜你喜欢
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    相关资源
    最近更新 更多