最近、電話の外部リムーバブル ストレージ (別名 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 携帯をサポートするためにこのユーティリティを完成させるのに助けが必要です。