staje się
otwarte nieudane:
EACCES (Permission denied)
na linii OutputStream myOutput = new FileOutputStream(outFileName);
Sprawdziłem root i spróbowałem android.permission.WRITE_EXTERNAL_STORAGE
.
Jak mogę rozwiązać ten problem?
try {
InputStream myInput;
myInput = getAssets().open("XXX.db");
// Path to the just created empty db
String outFileName = "/data/data/XX/databases/"
+ "XXX.db";
// Open the empty db as the output stream
OutputStream myOutput = new FileOutputStream(outFileName);
// Transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
// Close the streams
myOutput.flush();
myOutput.close();
myInput.close();
buffer = null;
outFileName = null;
}
catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
Odpowiedzi:
Miałem ten sam problem ... To
<uses-permission
było w złym miejscu. To prawda:uses-permission
Tag musi być pozaapplication
znacznikiem.źródło
<uses-permission>
Pojawia się ostrzeżenie: „ tag pojawia się po<application>
tagu”android:maxSdkVersion="18"
. To generowało ten wyjątekW przypadku API 23+ musisz poprosić o uprawnienia do odczytu / zapisu, nawet jeśli są już w twoim manifeście.
AndroidManifest.xml
Aby uzyskać oficjalną dokumentację dotyczącą żądania uprawnień dla interfejsu API 23+, sprawdź https://developer.android.com/training/permissions/requesting.html
źródło
Google ma nową funkcję w Androidzie Q : filtrowany widok pamięci zewnętrznej. Szybkim rozwiązaniem jest dodanie tego kodu w pliku AndroidManifest.xml:
Możesz przeczytać więcej na ten temat tutaj: https://developer.android.com/training/data-storage/compatibility
źródło
android:requestLegacyExternalStorage="true"
że nie złamie niższych wersji ryt? @UrielFrankelZauważyłem to raz podczas uruchamiania aplikacji w emulatorze. W ustawieniach emulatora należy poprawnie określić rozmiar pamięci zewnętrznej („Karta SD”). Domyślnie pole „pamięć zewnętrzna” jest puste, co prawdopodobnie oznacza, że nie ma takiego urządzenia, a EACCES jest wyrzucany, nawet jeśli w manifeście są przyznane uprawnienia.
źródło
Oprócz wszystkich odpowiedzi upewnij się, że nie używasz telefonu jako pamięci USB.
Miałem ten sam problem w HTC Sensation w włączonym trybie pamięci USB. Nadal mogę debugować / uruchamiać aplikację, ale nie mogę zapisać w pamięci zewnętrznej.
źródło
Dodaj android: requestLegacyExternalStorage = "true" na Android Oczywisty To pracował z Androidem 10 (Q) w SDK 29+
lub po migracji Android X .
źródło
Mój problem dotyczył „TargetApi (23)”, która jest potrzebna, jeśli minSdkVersion ma poniżej 23 lat.
Mam więc pozwolenie na żądanie za pomocą następującego fragmentu kodu
źródło
Rozwiązanie dla Androida Q :
źródło
Doświadczam tego samego. Znalazłem to, że jeśli przejdziesz do Ustawienia -> Menedżer aplikacji -> Twoja aplikacja -> Uprawnienia -> Włącz przechowywanie , rozwiąże to problem.
źródło
Okazało się, że to był głupi błąd, ponieważ mój telefon był nadal podłączony do komputera stacjonarnego i nie zdawałem sobie z tego sprawy.
Musiałem więc wyłączyć połączenie USB i wszystko działało dobrze.
źródło
Miałem ten sam problem na Samsungu Galaxy Note 3 z systemem CM 12.1. Problemem było to, że miałem
i musiałem go użyć do robienia i przechowywania zdjęć użytkowników. Gdy próbowałem załadować te same zdjęcia w ImageLoader, dostałem
(Permission denied)
błąd. Rozwiązaniem było jawne dodanieponieważ powyższe uprawnienie ogranicza jedynie uprawnienie do zapisu do wersji API 18, a wraz z nim uprawnienie do odczytu.
źródło
Oprócz wszystkich odpowiedzi, jeśli klienci używają Androida 6.0, Android dodał nowy model uprawnień dla (Marshmallow).
Sztuczka: jeśli celujesz w wersję 22 lub niższą, aplikacja zażąda wszystkich uprawnień w czasie instalacji, tak jak na każdym urządzeniu z systemem operacyjnym poniżej Marshmallow. Jeśli próbujesz na emulatorze, począwszy od Androida 6.0, musisz wyraźnie przejść do ustawień-> aplikacje-> YOURAPP -> uprawnienia i zmienić uprawnienia, jeśli je nadałeś.
źródło
Dziwnie po umieszczeniu ukośnika „/” przed nowym plikiem mój problem został rozwiązany. Zmieniłem to:
do tego:
źródło
Miałem ten sam problem i żadna z sugestii nie pomogła. Ale znalazłem interesujący powód, na fizycznym urządzeniu Galaxy Tab .
Gdy pamięć USB jest włączona, uprawnienia do odczytu i zapisu w pamięci zewnętrznej nie mają żadnego wpływu. Wyłącz pamięć USB, a przy odpowiednich uprawnieniach problem zostanie rozwiązany.
źródło
Spodziewałbym się, że wszystko poniżej
/data
należy do „pamięci wewnętrznej”. Powinieneś jednak móc pisać/sdcard
.źródło
Zmień właściwość uprawnień w swojej
/system/etc/permission/platform.xml
i grupie, o której mowa, jak poniżej.
źródło
Miałem ten sam błąd, gdy próbowałem zapisać obraz w folderze DCIM / camera na Galaxy S5 (Android 6.0.1) i zorientowałem się, że tylko ten folder jest ograniczony. Mógłbym po prostu pisać w DCIM / dowolnym folderze, ale nie w aparacie. Powinno to być ograniczenie / dostosowanie oparte na marce.
źródło
Gdy aplikacja należy do aplikacji systemowej, nie może uzyskać dostępu do karty SD.
źródło
pamiętaj, że nawet jeśli ustawisz wszystkie poprawne uprawnienia w manifeście: Jedynym miejscem, w którym aplikacje innych firm mogą pisać na twojej karcie zewnętrznej, są „własne katalogi” (tj. / sdcard / Android / data /) próbujące pisać do gdziekolwiek indziej: otrzymasz wyjątek: EACCES (odmowa zezwolenia)
źródło
Może odpowiedź brzmi:
na interfejsie API> = 23, jeśli zainstalujesz aplikację (aplikacja nie jest aplikacją systemową), powinieneś sprawdzić uprawnienia do przechowywania w „Ustawieniach - aplikacje”, dla każdej aplikacji jest lista uprawnień! Powinieneś to sprawdzić! próbować
źródło
W moim przypadku korzystałem z biblioteki wyboru plików, która zwróciła ścieżkę do pamięci zewnętrznej, ale zaczęła się od
/root/
. I nawet z uprawnieniem WRITE_EXTERNAL_STORAGE udzielonym w czasie wykonywania nadal mam błąd EACCES (odmowa zezwolenia) .Użyj więc,
Environment.getExternalStorageDirectory()
aby uzyskać prawidłową ścieżkę do pamięci zewnętrznej.Przykład:
Nie można pisać:
/root/storage/emulated/0/newfile.txt
Można pisać:
/storage/emulated/0/newfile.txt
Wyjście 1:
Wyjście 2:
źródło
root
części ze ścieżki rozwiązało mój problem.Podczas korzystania z tej przestarzałej metody od Androida 29 pojawi się ten sam błąd:
java.io.FileNotFoundException: open failed: EACCES (Permission denied)
Rozdzielczość tutaj:
getExternalStoragePublicDirectory jest przestarzałe w Androidzie Q
źródło
Dla każdego, kto przychodzi tutaj z wyników wyszukiwania i celuje w Androida 10: Android 10 (API 29) zmienia niektóre uprawnienia związane z pamięcią masową.
Rozwiązałem ten problem, zastępując moje poprzednie wystąpienia
Environment.getExternalStorageDirectory()
(które są przestarzałe API 29)context.getExternalFilesDir(null)
.Pamiętaj, że
context.getExternalFilesDir(type)
może zwrócić wartość null, jeśli lokalizacja pamięci nie jest dostępna, więc upewnij się, że sprawdzasz, czy masz uprawnienia zewnętrzne.Przeczytaj więcej tutaj .
źródło
Tworzę folder w katalogu / data / w moim pliku init.rc (chowając się wokół aosp na Nexusie 7) i miałem dokładnie ten problem.
Okazało się, że udzielenie uprawnienia do folderu rw (666) nie było wystarczające i musiał to być rwx (777), wtedy wszystko działało!
źródło
Egzekwowanie uprawnień do przechowywania danych po wersji 6.0 można ominąć, jeśli masz zrootowane urządzenie za pomocą następujących poleceń adb:
źródło
Dodaj zezwolenie w manifeście.
źródło
android.permission.READ_INTERNAL_STORAGE
Miałem ten sam problem (API> = 23).
Rozwiązanie https://stackoverflow.com/a/13569364/1729501 działało dla mnie, ale nie było praktyczne odłączanie aplikacji do debugowania.
moim rozwiązaniem było zainstalowanie odpowiedniego sterownika urządzenia adb w systemie Windows. Sterownik USB Google nie działał na moim urządzeniu.
KROK 1: Pobierz sterowniki adb dla swojej marki urządzenia.
KROK 2: Przejdź do menedżera urządzeń -> inne urządzenia -> wyszukaj wpisy ze słowem „adb” -> wybierz Aktualizuj sterownik -> podaj lokalizację w kroku 1
źródło
po dodaniu pozwolenia rozwiązałem mój problem
źródło
Dodaj zależności stopni
Dodaj poniższy kod do swojej głównej działalności.
źródło
W moim przypadku błąd pojawiał się na linii
ponieważ nie mogłem utworzyć nowego pliku na karcie SD, musiałem zastosować podejście DocumentFile.
W przypadku powyższego pytania problem można rozwiązać za pomocą tego podejścia,
Zobacz także ten wątek. Jak korzystać z nowego interfejsu API dostępu do karty SD przedstawionego dla Androida 5.0 (Lollipop)?
źródło