繁体   English   中英

如何在 android 中访问外部存储(可移动 SD 卡)?

[英]How to get access to External Storage (The removable SD Card) in android?

我一直在尝试在 android 中访问内部和外部 SD 卡。 我已经尝试了 StackOverFlow 中可用的许多代码,但不适用于大多数或所有 Android 版本。 然后,我找到了两个解决方案。 一种适用于 Kitkat 及以上,另一种适用于低于 Kitkat。 我试图合并他们两个,它的工作原理!

如果有人有比这更好的解决方案,请分享。

这两个答案是我合并以使其工作的答案。

  1. 如何以编程方式在android6.0中获取SD_Card路径

  2. 查找外部 SD 卡位置

这是解决方案,

AndroidManifest.xml添加这行代码以获取 Android 读取外部存储的权限。

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

现在,将此类添加到您的项目中。

public class StoragePath {
File[] getExternalFilesDirs;

/**
 * Constructor for KitKat & above
 * @param getExternalFilesDirs
 */
public StoragePath(File[] getExternalFilesDirs) {
    this.getExternalFilesDirs = getExternalFilesDirs;
}

/**
 * Constructor for lower than Kitkat
 *
 */
public StoragePath() {

}

public String[] getDeviceStorages() {
    List<String> results = new ArrayList<>();

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { //Method 1 for KitKat & above
        File[] externalDirs = getExternalFilesDirs;

        for (File file : externalDirs) {
            String path = file.getPath().split("/Android")[0];

            boolean addPath = false;

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                addPath = Environment.isExternalStorageRemovable(file);
            } else {
                addPath = Environment.MEDIA_MOUNTED.equals(EnvironmentCompat.getStorageState(file));
            }

            if (addPath) {
                results.add(path);
            }
        }
    }

    if (results.isEmpty()) { //Method 2 for all versions
        final List<String> out = new ArrayList<>();
        String reg = "(?i).*vold.*(vfat|ntfs|exfat|fat32|ext3|ext4).*rw.*";
        String s = "";
        try {
            final Process process = new ProcessBuilder().command("mount")
                    .redirectErrorStream(true).start();
            process.waitFor();
            final InputStream is = process.getInputStream();
            final byte[] buffer = new byte[1024];
            while (is.read(buffer) != -1) {
                s = s + new String(buffer);
            }
            is.close();
        } catch (final Exception e) {
            e.printStackTrace();
        }

        // parse output
        final String[] lines = s.split("\n");
        for (String line : lines) {
            if (!line.toLowerCase(Locale.US).contains("asec")) {
                if (line.matches(reg)) {
                    String[] parts = line.split(" ");
                    for (String part : parts) {
                        if (part.startsWith("/"))
                            if (!part.toLowerCase(Locale.US).contains("vold"))
                                out.add(part);
                    }
                }
            }
        }
        results.addAll(out);
    }

    //Below few lines is to remove paths which may not be external memory card, like OTG (feel free to comment them out)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        for (int i = 0; i < results.size(); i++) {
            if (!results.get(i).toLowerCase().matches(".*[0-9a-f]{4}[-][0-9a-f]{4}")) {
                Log.d("Tag", results.get(i) + " might not be extSDcard");
                results.remove(i--);
            }
        }
    } else {
        for (int i = 0; i < results.size(); i++) {
            if (!results.get(i).toLowerCase().contains("ext") && !results.get(i).toLowerCase().contains("sdcard")) {
                Log.d("Tag", results.get(i) + " might not be extSDcard");
                results.remove(i--);
            }
        }
    }

    //Get path to the Internal Storage aka ExternalStorageDirectory
    final String internalStoragePath = Environment.getExternalStorageDirectory().getAbsolutePath();
    results.add(0, internalStoragePath);

    String[] storageDirectories = new String[results.size()];
    for (int i = 0; i < results.size(); ++i) storageDirectories[i] = results.get(i);

    return storageDirectories;

}
}

现在要使用这个类,

StoragePath storagePath;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
        storagePath = new StoragePath(getExternalFilesDirs(null));
}else {
        storagePath = new StoragePath();
}

String[] storages;
storages = storagePath.getDeviceStorages();

字符串数组storages现在包含storages的路径。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM