如何在 android 中获取存储目录的路径

问题描述 投票:0回答:1

有什么方法可以获取

/storage/
目录。我尝试使用
Environment.getExternalStorageDirectory()
但它返回
/storage/emulated/0
我知道我可以使用
file.getParent()
但由于某种原因我不能使用它。我只想使用某些功能直接访问
/storage/
目录...提前致谢。

android android-file
1个回答
1
投票

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

为此你可以使用这个(从https://stackoverflow.com/a/18871043/修改),

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;
    }

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

© www.soinside.com 2019 - 2024. All rights reserved.