Androidアプリケーションでは、次のことを行う必要があります:
If(removable SdCard is present){
String path=get the path of removable Sdcard() ;
//using this path we will create some files in sdcard
} else{
//display error message
}
これを実現するために、コードを次のように使用しました。
If (Environment.getExternalStorageState().equalsIgnoreCase(Environment.MEDIA_MOUNTED)){
String path= Environment.getExternalStorageDirectory().getPath();
}
上記のコードは、最新の Android モバイルの一部で失敗します。これについて私たちを助けてください。
以下は、私たちが試したことの詳細です。
- ICS および JellyBean の OS を搭載した Android モバイルでは、リムーバブル SD カードの正確なパスは、デバイスの製造元によって異なります。
下の表を参照してください
Tested Devices OS version removable sdcard path internal sd path
Samsung galaxy s2 4.0.4 /mnt/sdcard/external_sd /mnt/sdcard
Samsung S Advance 4.1.2 /storage/extSdCard /storage/sdcard0
Samsung Galaxy s3 4.0.4 /mnt/extSdCard /mnt/sdcard
Samsung Galaxy Note 4.0.4 /mnt/sdcard/external_sd /mnt/sdcard
これらのデバイスで上記のコードを実行すると、次の結果が得られました。
Android API Environment.getExternalStorageDirectory().getPath() は内部 sd パスのみを返します
また、API Environment.getExternalStorageState() は、SD カードが取り外されていても、上記のデバイスで Environment.MEDIA_MOUNTED を返します。
さらに、API Environment.isExternalStorageRemovable() は、リムーバブル SD カードが存在するかどうかに関係なく、上記のデバイスに対して常に false を返します。
Googleで検索し、提供されたいくつかの機能を試しました.デバイスにマウントされているストレージパスのリストのみが表示されます.しかし、削除されたSDカードが存在するかどうかは示されません.
ストレージパスを取得しようとした関数:
private static String getMountedPaths(){
String sdcardPath = "";
Runtime runtime = Runtime.getRuntime();
Process proc = null;
try {
proc = runtime.exec("mount");
} catch (IOException e1) {
e1.printStackTrace();
}
InputStream is = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
String line;
BufferedReader br = new BufferedReader(isr);
try {
while ((line = br.readLine()) != null) {
if (line.contains("secure")) continue;
if (line.contains("asec")) continue;
if (line.contains("fat")) {//TF card
String columns[] = line.split(" ");
if (columns != null && columns.length > 1) {
mount.add(columns[1]);
sdcardPath=columns[1];
}
} else if (line.contains("fuse")) {//internal storage
String columns[] = line.split(" ");
if (columns != null && columns.length > 1) {
mount.add(columns[1]);
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
return sdcardPath;
}
Android のストレージ パスのリストを取得するために、上記よりも優れた関数はありますか? 上記の問題の解決にも役立ちます。