2013-03-19 3 views
39

Próbuję zapisać plik na mojej karcie SD na moim Samsung Galaxy Nexusie z 4.2.2. Z mojej aplikacji używamgetExternalStorageDirectory nie działa

Environment.getExternalStorageDirectory() 

ale zwraca

/storage/emulated/0/ 

co nie jest moje informacje gdzie znajduje się SDcard. Czy istnieje jakaś działająca metoda, dzięki której mogę uzyskać poprawną ścieżkę dostępu do mojej karty SD?

+0

Czy możesz pokazać więcej kodu, abyśmy mogli uzyskać to, czego próbowałeś? –

+0

Właściwie to może być. System prawdopodobnie ładuje tam kartę SD i tworzy wirtualną reprezentację jako dysk w katalogu głównym –

+0

Ścieżki zmienione od 4.2 z powodu funkcji wielu użytkowników. –

Odpowiedz

5

Environment.getExternalStorageDirectory() odnosi się do tego, co producent urządzenia uważał za "pamięć zewnętrzną". Mogę być kimś innym niż karta SD.

Można uzyskać więcej informacji tutaj: Find an external SD card location

11

Właściwie, to jest prawidłowa lokalizacja.

Od Androida w wersji 4,2 Google wprowadziło wiele kont użytkowników. Każdy użytkownik ma swoją własną pamięć zewnętrzną, która ma identyfikator użytkownika na ścieżce, aby zachować wyjątkowość.

Podstawowy (domyślny) identyfikator użytkownika to 0. Otrzymasz /storage/emulated/0/ jako ścieżkę do pamięci zewnętrznej.

+2

jest tylko starsze w tym folderze, a nie folder 0.również nie ma problemu z używaniem tej metody w moich innych aplikacjach, tylko tej. –

+0

@LukePring To dowiązanie symboliczne. To nie jest prawdziwy folder. –

+1

Masz na myśli, że tam powinien być dowiązaniem symbolicznym./storage/emulated/0: Brak takiego pliku lub katalogu – VMcPherron

0

Jasne? Jak myślisz, gdzie jest zamontowana twoja karta SD? Spróbuj wykonać w tym katalogu ls -l - prawdopodobnie jest to dowiązanie symboliczne do /storage/emulated/0/.

+0

Używam ls -l w tej chwili dla innej aplikacji, symlink pokazuje do aplikacji, ale nie do mojego terminalu, który jest najdziwniejszy. –

-1

Spróbuj użyć getExternalFilesDir() lub getExternalStoragePublicDirectory().

Od Android 4.2 documentation

+0

Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_PICTURES) zwraca ścieżkę/storage/emulated/0/Pictures Która nadal jest nieważna na moim N7 – VMcPherron

+0

Rozumiem, że powinna być dostępna dla aplikacji (nie adb) podczas uruchamiania, ale nie może znajdź pliki w tym katalogu, gdy wyraźnie mam wiele plików. (ls/mnt/shell/emulated/0/Pictures/* jpg) – VMcPherron

9

Właśnie dowiedziałem to sposób Jelly Bean radzenia sobie z brakiem android.permission.WRITE_EXTERNAL_STORAGE zgody. Nie widziałem takiego zachowania w starszych wersjach Androida.

Wystarczy dodać tę linię do AndroidManifest.xml:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
+24

To nie naprawia tego jako takiego. Mam ten zestaw w moim Manifeście i nadal wraca jako **/storage/emulated/0 **. Kiedy używam powłoki dla urządzenia **/storage/emulated/0 ** nie istnieje. Zamiast ** 0 ** istnieje ** starsza wersja **. –

+4

@MichaelNguyen Nie można zobaczyć katalogu **/storage/emulated/0 ** z powłoki adb (nawet jako root). Występuje tylko w procesach uruchomionych przez użytkownika. Powinieneś zobaczyć go z emulatora terminala na urządzeniu i uzyskać do niego dostęp z dowolnej aplikacji. – ge0rg

1

Myślę, że z powodu korzystania z emulatora genymotion, ścieżka jest prawdziwe i Eclipse to lokalizuje na

File Explorer - > mnt - > shell - > emulated -> 0 

nadzieję, że pomaga;)

0

W jakiś sposób zgubiłem dowiązanie symboliczne w/storage/emulated/0, powodując podobny błąd. To, co zrobiłem, to skorzystanie z aplikacji aparatu do zrobienia zdjęcia. Zauważyłem, że szczegóły obrazu mówią, że znajdowało się w/storage/emulated/0, chociaż katalog ten nie istniał z eksploratora plików. Następnie zrestartowałem telefon. Po ponownym uruchomieniu łącze istniało.