32

私はグーグルしてきましたが、どのメーカー/モデルがSDカード/外部ストレージにどのパスを使用しているかを見つけるのはとても難しいです。

  • 私は次の人が見つけることができる内部ストレージパスについて話していません:

Environment.getExternalStorageDirectory()

getExternalStorageDirectory()一部のデバイスでは、外部SDカードを指すことがあることを私は知っています。

これが私が外部パスのいくつかの一般的なパスを見つけたものです(どのメーカーがどのパスを使用しているかわからない):

/emmc
/mnt/sdcard/external_sd
/mnt/external_sd
/sdcard/sd
/mnt/sdcard/bpemmctest
/mnt/sdcard/_ExternalSD
/mnt/sdcard-ext
/mnt/Removable/MicroSD
/Removable/MicroSD
/mnt/external1
/mnt/extSdCard
/mnt/extsd
/mnt/usb_storage  <-- usb flash mount
/mnt/extSdCard  <-- usb flash mount
/mnt/UsbDriveA  <-- usb flash mount
/mnt/UsbDriveB  <-- usb flash mount

これらは私がグーグルで見つけたものです。

特定のファイルを探すために、内部+外部ストレージ+USBフラッシュドライブ全体をスキャンする必要があります。パスが見つからない場合は、上記のリストに追加してください。各メーカーが使用しているパスを誰かが知っている場合は、私たちと共有してください。

4

4 に答える 4

11

また、どこかからのあなたのようなリストから始めて (元のソースが見つかりませんでした)、ユーザーのフィードバックから収集したいくつかのパスを追加し続けます。上記のリストに重複があります。

    /storage/sdcard1 //!< Motorola Xoom
    /storage/extsdcard  //!< Samsung SGS3
    /storage/sdcard0/external_sdcard  // user request
    /mnt/extsdcard
    /mnt/sdcard/external_sd  //!< Samsung galaxy family
    /mnt/external_sd
    /mnt/media_rw/sdcard1   //!< 4.4.2 on CyanogenMod S3
    /removable/microsd              //!< Asus transformer prime
    /mnt/emmc
    /storage/external_SD            //!< LG
    /storage/ext_sd                 //!< HTC One Max
    /storage/removable/sdcard1      //!< Sony Xperia Z1
    /data/sdext
    /data/sdext2
    /data/sdext3
    /data/sdext4
    /sdcard1                       //Sony Xperia Z
    /sdcard2                       //HTC One M8s
    /storage/microsd               //ASUS ZenFone 2

あなたが達成したいこと(特定のファイルのすべての可能なパスをスキャンする)については、この方法で(既知のパスのリストを使用して)それを行うことはまったく不可能だと思います。同じデバイスの一部のパスは、Android のアップグレード間でも変更されました。

于 2014-01-23T15:23:03.077 に答える
0

Oceanuz が提供するパスに基づいて、(大文字と小文字を区別せずに) 外部ストレージ パスを検索し、それを文字列として返すメソッドを作成しました。

注:メソッド内でStreamSupportライブラリを使用したので、それを機能させるには、jar ファイルをダウンロードしてプロジェクトの libs フォルダーに追加する必要があります。それだけです。

  public static String getExternalSdPath(Context context) {
    List<String> listOfFoldersToSearch = Arrays.asList("/storage/", "/mnt/", "/removable/", "/data/");
    List<String> listOf2DepthFolders = Arrays.asList("sdcard0", "media_rw", "removable");
    List<String> listOfExtFolders = Arrays.asList("sdcard1", "extsdcard", "external_sd", "microsd", "emmc", "ext_sd", "sdext",
            "sdext1", "sdext2", "sdext3", "sdext4");
    final String[] thePath = {""};
    Optional<File> optional = StreamSupport.stream(listOfFoldersToSearch)
            .filter(s -> {
                File folder = new File(s);
                return folder.exists() && folder.isDirectory();
            }) //I got the ones that exist and are directories
            .flatMap(s -> {
                try {
                    List<File> files = Arrays.asList(new File(s).listFiles());
                    return StreamSupport.stream(files);
                } catch (NullPointerException e) {
                    return StreamSupport.stream(Collections.emptyList());
                }
            }) //I got all sub-dirs of the main folders
            .flatMap(file1 -> {
                if (listOf2DepthFolders.contains(file1.getName().toLowerCase())) {
                    try {
                        List<File> files = Arrays.asList(file1.listFiles());
                        return StreamSupport.stream(files);
                    } catch (NullPointerException e) {
                        return StreamSupport.stream(Collections.singletonList(file1));
                    }
                } else
                    return StreamSupport.stream(Collections.singletonList(file1));
            }) //Here I got all the 2 depth and 3 depth folders
            .filter(o -> listOfExtFolders.contains(o.getName().toLowerCase()))
            .findFirst();

    optional.ifPresent(file -> thePath[0] = file.getAbsolutePath());

    Log.i("Path", thePath[0]);

    return thePath[0];
}

Sd カードのパスが見つからない場合、このメソッドは空の文字列を返します。

于 2015-05-15T14:09:47.970 に答える