Wymienna pamięć masowa (zewnętrzna) sdcard wg producentów

Byłem Googling wokół, ale to jest baaardzo trudno znaleźć, co producenci / modele użyć które ścieżki sdcard / pamięci zewnętrznej.

  • nie mówię o ścieżce pamięci wewnętrznej, którą można znaleźć poprzez:

Environment.getExternalStorageDirectory()

wiem, że getExternalStorageDirectory() czasami wskazuje na zewnętrzną kartę SD na niektórych urządzeniach.

Oto, co znalazłem wspólną ścieżkę dla zewnętrznej ścieżki (Nie wiem, który producent używa której ścieżki):

/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

Oto co znalazłem przez Googlowanie.

Muszę przeskanować całą pamięć wewnętrzną + zewnętrzną + pamięć flash USB, aby wyszukać określony plik. Jeśli brakuje mi żadnej ścieżki, Proszę dodać do powyższej listy. Jeśli ktoś zna ścieżki stosowane przez każdego producenta, proszę podzielić się z nami.

Author: jclova, 2012-12-20

5 answers

Dobre wieści! W KitKat istnieje teraz publiczne API do interakcji z tymi drugorzędnymi współdzielonymi urządzeniami pamięci masowej.

Nowe metody Context.getExternalFilesDirs() i Context.getExternalCacheDirs() mogą zwracać wiele ścieżek, w tym zarówno urządzenia pierwotne, jak i wtórne. Następnie możesz je iterować i sprawdzić Environment.getStorageState() i File.getFreeSpace(), Aby określić najlepsze miejsce do przechowywania plików. Metody te są również dostępne na ContextCompat w bibliotece support-v4.

Zauważ również, że jeśli jesteś zainteresowany tylko wykorzystaniem katalogów zwracanych przez Context, nie potrzebujesz już uprawnień READ_ lub WRITE_EXTERNAL_STORAGE. W przyszłości zawsze będziesz mieć dostęp do odczytu/zapisu tych katalogów bez dodatkowych uprawnień.

[9]} aplikacje mogą również kontynuować pracę na starszych urządzeniach, wycofując żądanie zezwolenia w następujący sposób:]}
<uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="18" />
 12
Author: Jeff Sharkey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-20 23:25:24

Zacząłem również od listy takiej jak twoja skądś (niestety nie mogłem znaleźć oryginalnego źródła) i nadal dodaję kilka ścieżek zebranych z opinii użytkowników. Istnieją duplikaty do powyższej listy.

    /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

Dla tego ,co chcesz osiągnąć (skanowanie wszystkich możliwych ścieżek dla określonych plików), myślę, że jest to całkiem niemożliwe, aby zrobić to w ten sposób (używając listy znanych ścieżek). Niektóre ścieżki na tym samym urządzeniu zmieniły się nawet między aktualizacją Androida.

 11
Author: oceanuz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-02 05:56:13

Bazując na ścieżkach podanych przez oceanuz, napisałem metodę, która lokalizuje zewnętrzną ścieżkę pamięci (ignorując wielkość liter) i zwraca ją jako łańcuch znaków.

Uwaga: użyłem biblioteki StreamSupport wewnątrz mojej metody, więc aby mogła działać, musisz pobrać plik jar i dodać go do folderu libs w swoim projekcie i to wszystko.

  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];
}

Ta metoda zwróci pusty łańcuch, jeśli nie znaleziono ścieżki na karcie Sd.

 1
Author: sudo_rizwan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-15 14:09:47

Próbowałem znaleźć ścieżkę do mojej zewnętrznej karty SD na Sony Xperia XA. Następnie zainstalowałem ES File explorer i wyraźnie pokazano ścieżkę do dowolnego folderu, wewnętrznego lub zewnętrznego, w oknie Właściwości. Znalazłem ścieżkę do zewnętrznego SD jako / storage / C4EE-F3A3. Próbowałem zapisać plik wyjściowy z Python3 na zewnętrznym SD, ale nie miał uprawnień do zapisu w dowolnym miejscu innym niż folder Qpython w wewnętrznym SD.

 0
Author: himukala,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-26 22:39:44

Czy próbowałeś:

Environment.getExternalStoragePublicDirectory.getExternalStorageDirectory(String type);

Gdzie type jest katalogiem zdefiniowanym przez system android, którego potrzebujesz jak środowisko.DIRECTORY_DOWNLOADS, który da ci katalog pobierania

To nie" getExternalStorageDirectory "to " getExternalStoragePublicDirectory". Zauważ, że dla każdego urządzenia z Androidem zwróci miejsce, w którym dzieje się przechowywanie (na przykład: / mnt / external_sd) pracował na moim transformerze 101, Nexusie 10 i galaxy S2. Potrzebowałem go do ściągnięcia pliku na storage

Oto dokumentacja http://developer.android.com/reference/android/os/Environment.html

 -3
Author: Dante,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-05 19:49:08