4

最近、電話の外部リムーバブル ストレージ (別名 SDCard) に厳密にデータを書き込めるようにする必要がありました。「外部」内部ストレージのないローエンド デバイスの場合 (つまり、私の言いたいことはわかります)、これは問題ではありません。

Environment.getExternalStorageDirectory().getAbsolutePath()

返す

/mnt/sdcard

SDカードへのパスでもあります。ただし、フラッシュ ストレージが組み込まれたハイエンドの電話機(sgs 2 など)では/mnt/sdcard、 から返されるEnvironment.getExternalStorageDirectory().getAbsolutePath()は内部ストレージへのパスにすぎません。SDカードへの実際のパスは `

/mnt/sdcard/external_sd`.

これはこれで終わりではありませんが、ICSにアップグレードされたsgs2で試したとき、sdカードへのパスは現在

/mnt/emmc.

今、SDカードルートへのパスを返す静的メソッドを持つExternalStorageと呼ばれる一般的なユーティリティクラスを構築しようとしています(合計スペース、使用可能なスペース、特定のディレクトリによって消費されたスペースなどを取得する他のメソッドもあります) .) これまでのところ、私が持っているのはこれです:

更新版:

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

誰かがすでにこれを行っていますか?多くの mfg 固有のパスが欠落していることはわかっているので、できるだけ多くの 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;
        }
    }    

「sub」が LOST.DIR フォルダーで見つかった場合、その値を sharedPrefs に書き込んで、このルックアップが 1 回だけ実行され (値が保存されていない場合)、その後 prefs からフェッチされるようにするか、アプリがユーザーが LOST.DIR を削除し、現在どこにも存在しない場合でも、このパスを知っています。

于 2012-05-28T15:01:20.390 に答える