Wątek przeniesiony 2020-07-27 19:20 z Java przez somekind.

Problem z utworzeniem pliku na karcie SD

0

Witajcie
Piszę pewną aplikację w Javie na Androida, korzystam z Android Studio.
Mam potrzebę utworzyć plik na karcie SD i zapisać do niego dane.
Niestety coś jest nie tak i plik tworzy się w pamięci wewnętrznej urządzenia.

Naturalnie w pliku AndroidManifest.xml mam linijki:

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

Plik tworzę w następujący sposób:

File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), "plik.csv");
Environment.getExternalStorageDirectory().getAbsolutePath().toString()

Użycie powyższej linijki i wypisanie na ekran daje ciąg "storage/emulated/0"

Device File Explorer w Android Studio nie pozwala zajrzeć do "storage/emulated/0".
Plik tworzy się w "/sdcard" nie zależnie czy w smartfonie na którym testuję aplikację mam kartę SD czy nie.
Natomiast w folderze "/storage" mam folder "255B-1402" i to jest moja karta SD.
Dlaczego plik nie jest tam tworzony?
Co robię źle?
Prócz fizycznego smartfona próbowałem na emulowanym urządzeniu i sytuacja jest taka sama :(

1

Nazwa storage/emulated/0 powinna dać Ci do myślenia. Android nie podaje aplikacjom jawnych ścieżek, gdzie pliki się znajdują, tylko chowa je za symbolicznymi linkami. Folder /sdcard nie oznacza tylko fizycznej pamięci. Może to oznaczać zarówno prawdziwą kartę SD jak i część wbudowanej pamięci flash. O zachowaniu tej ścieżki decydują producenci telefonów.

Po opisie w końcu nie wiem czy sprawdziłeś czy pliku nie ma na karcie, czy tylko patrzyłeś na ścieżkę. Zapisz plik z jakąś treścią w tym folderze, który zwraca Ci Environment.getExternalStorageDirectory() i zobacz, czy faktycznie nie ma pliku na karcie SD.

0

Sprawdzałem i na karcie SD nie ma tego pliku. Tworzy się on w katalogu głównym pamięci wewnętrznej urządzenia a nie na karcie SD tak jak bym chciał :(

1

getExternalStorageDirectory zwraca ścieżkę do wewnętrznej karty sd, bo dla Androida to jest pamięć zewnętrzna - w wielu telefonach są dwie partycje, jedna to wewnętrzna karta sd, a druga to zewnętrzna karta sd,. ale żadna z nich to nie jest ta karta sd, którą wkładasz do telefonu.

Możesz spróbować wyciągnąć ścieżkę stąd: https://developer.android.com/reference/androidx/core/content/ContextCompat#getExternalFilesDirs(android.content.Context,%20java.lang.String)

Ale chyba nie ma uniwersalnego sposobu, żeby odróżnić który katalog to jest ta karta wyciągana, chociaż wśród tych ścieżek będzie.

P.S. prawidłowo to masz w ogóle tej ścieżki nie znać i korzystać z tego: https://developer.android.com/training/data-storage/shared/documents-files - system spyta użytkownika, gdzie karta sd jest, użytkownik ma wskazać, a aplikacja operuje na uri i nie zna prawdziwych ścieżek. Wątpię, że w ogóle system pozwoli aplikacji pisać w nie swoim katalogu na zewnętrznej karcie sd (czyli w głównym od pobranego tak, jak napisałem), może w KitKat się dało, w nowszych już nie. Pisać możesz sobie bezpośrednio tylko na karcie zwracanej przez getExternalStorageDirectory, a nie po tej wkładanej ani nie po nośniku usb (chyba że to będzie katalog przedzielony aplikacji przez system, pobrany przez getExternalFilesDirs - może to ci wystarczy)

1 użytkowników online, w tym zalogowanych: 0, gości: 1