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.
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ń.
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />
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.
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.
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.
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
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