4

最近,我需要能够在手机的外部可移动存储(又名 SDCard)上严格写入一些数据。对于没有“外部”内部存储的低端设备(你知道我的意思),这不是问题,因为

Environment.getExternalStorageDirectory().getAbsolutePath(),

返回

/mnt/sdcard

也是sdcard的路径。然而,在具有内置闪存存储(例如 sgs 2)的高端手机上,/mnt/sdcard从 中返回Environment.getExternalStorageDirectory().getAbsolutePath()的 只是通往内部存储的路径。sdcard的真实路径是`

/mnt/sdcard/external_sd`。

然而,这并不止于此,因为当我尝试使用升级到 ICS 的 sgs2 时,现在 sd 卡的路径是

/mnt/emmc.

现在我正在尝试构建一个名为 ExternalStorage 的通用实用程序类,它具有一个静态方法,该方法返回到 sdcard 根目录的路径(以及一些其他方法来获取总空间、可用空间、特定目录消耗的空间等.) 到目前为止,我所拥有的是:

更新后的版本:

public static String getRemovableStoragePath() {

        File f = null;
//      Log.d(TAG, "Build.DEVICE: " + Build.DEVICE);
//      Log.d(TAG, "Build.MANUFACTURER: " + Build.MANUFACTURER);
//      Log.d(TAG, "Build.MODEL: " + Build.MODEL);

        if (Build.VERSION.RELEASE.startsWith("4")) {
            f = new File("/mnt/emmc");
        }
        if (Build.MODEL.toLowerCase().startsWith("mele")) {
            return "/mnt/extern_sd0";
        }
        if (Build.DEVICE.equals("nuclear-zoop") || Build.DEVICE.equals("nuclear-f900")) {
            f = new File("/mnt/extsd");
        }

        String path = Environment.getExternalStorageDirectory().getAbsolutePath();
        String extendedPath = "";
        if (Build.DEVICE.toLowerCase().contains("samsung") || Build.MANUFACTURER.toLowerCase().contains("samsung")) {
            extendedPath = "/external_sd/";
            try {
                f = new File(path + extendedPath);
                if (f.exists() && f.isDirectory()) {
                    return f.getAbsolutePath();
                } else if (Build.MODEL.toLowerCase().contains("gt-i9300")) {
                    extendedPath = "/mnt/extSdCard/";
                    try {
                        f = new File(extendedPath);
                        if (f.exists() && f.isDirectory()) {
                            return f.getAbsolutePath();
                        }
                    } catch (Exception e) {
                        // continue execution
                    }
                } else {
                    extendedPath = "/sd";
                }
            } catch (Exception e) {
                // contine execution
            }
        } else if (Build.DEVICE.toLowerCase().contains("e0") || Build.MANUFACTURER.toLowerCase().contains("LGE")) {
            extendedPath = "/_ExternalSD/";
        } else if (Build.MANUFACTURER.toLowerCase().contains("motorola") || Build.DEVICE.toLowerCase().contains("olympus")) {
            f = new File("/mnt/sdcard-ext");
        }
        try {
            if (!extendedPath.equals("")) {
                f = new File(path + extendedPath);
            }
            if (f.exists() && f.isDirectory()) {
                //              Log.d(TAG, "path: " + f.getAbsolutePath());
                return f.getAbsolutePath();
            } else {
            }
        } catch (Exception e) {
            //          e.printStackTrace();
            // f is probably null. no need to print stacktrace.
            return path;
        }

        return path;
//      return Environment.getExternalStorageDirectory().getAbsolutePath();
    }

有人已经这样做了吗?我知道我缺少许多特定于制造商的路径,因此我需要帮助来完成此实用程序以支持尽可能多的 Android 手机。

4

1 回答 1

2

我不确定这有多可靠,但由于可移动 SD 卡在其根目录中包含 LOST.DIR 文件夹并在启动时重新创建(在用户可能删除它的情况下)......

    File root = new File(Environment.getExternalStorageDirectory().getAbsolutePath());
    for (File sub : root.listFiles()) {
        if (new File(sub + "/lost.dir").exists()) {
            // 'sub' is probably the removable SD
            break;
        }
    }    

如果在 LOST.DIR 文件夹中找到“sub”,可能希望将其值写入 sharedPrefs 以便仅执行一次此查找(如果没有存储值),然后仅从 prefs 中获取,或者以便应用程序即使用户删除了 LOST.DIR 并且它目前在任何地方都不存在,也知道这条路径。

于 2012-05-28T15:01:20.390 回答