8

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 のストレージ パスのリストを取得するために、上記よりも優れた関数はありますか? 上記の問題の解決にも役立ちます。

4

1 に答える 1