W Lollipop, funkcja pobierania działa dobrze w mojej aplikacji, ale kiedy zaktualizowałem do Marshmallow, moja aplikacja ulega awarii i wyświetla ten błąd, gdy próbuję pobrać z Internetu na kartę SD:
Neither user nor current process has android.permission.WRITE_EXTERNAL_STORAGE
Narzeka na ten wiersz kodu:
DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
manager.enqueue(request);
Mam uprawnienia w manifeście poza aplikacją:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
Wyczyściłem i odbudowałem projekt, ale nadal się zawiesza.
Odpowiedzi:
Należy sprawdzić, czy użytkownik przyznał uprawnienia do przechowywania zewnętrznego za pomocą:
Jeśli nie, musisz poprosić użytkownika o przyznanie aplikacji uprawnienia:
Oczywiście są one przeznaczone tylko dla urządzeń Marshmallow, więc musisz sprawdzić, czy Twoja aplikacja działa na Marshmallow:
Upewnij się również, że Twoja działalność się realizuje
OnRequestPermissionResult
Całe pozwolenie wygląda następująco:
Wywołanie zwrotne wyniku uprawnień:
źródło
Manifest.permission.WRITE_EXTERNAL_STORAGE
zawsze zwraca „-1”, tj. Odmowa dostępu. Sprawdź nową dokumentację, która mówi, że od API 19 nie potrzebujeszWRITE_EXTERNAL_STORAGE
pozwolenia. Jak wspomniano w niektórych z powyższych komentarzy, powinieneś zrobić to wszystko zManifest.permission.READ_EXTERNAL_STORAGE
getExternalFilesDir()
. W innych przypadkach zezwolenieandroid.permission.WRITE_EXTERNAL_STORAGE
musi być zadeklarowane w sposób najbardziej zrozumiały.Dzięki uprzejmości przejdź do sekcji Proszenie o uprawnienia w czasie wykonywania .
Przykład
Zadeklaruj to jako globalne
Dodaj to w swojej
onCreate()
sekcjiPo setContentView (R.layout.your_xml);
Teraz dodajemy checkPermission () i requestPermission ()
FYI
onRequestPermissionsResult
źródło
Sprawdź wiele uprawnień na poziomie API 23 Krok 1:
Krok 2:
Krok 3:
Krok 4: w onCreate of Activity checkPermissions ();
źródło
never ask again
kilkoma uprawnieniami i ich brakuje? Czy użytkownik otrzymuje jakieś uwagi? Byłoby miło zobaczyć prawdziwy przykład tego lub więcej komentarzy na temat fragmentów kodu.O ile nie ma wyraźnego wymogu zapisywania w pamięci zewnętrznej, zawsze możesz zapisać pliki w katalogu aplikacji. W moim przypadku musiałem zapisywać pliki i po zmarnowaniu 2 do 3 dni dowiedziałem się, czy zmieniam ścieżkę przechowywania z
do
działa jak urok na wszystkich urządzeniach. Dzieje się tak, ponieważ do pisania w pamięci zewnętrznej potrzebujesz dodatkowych uprawnień, ale pisanie w wewnętrznym katalogu aplikacji jest proste.
źródło
musisz użyć uprawnienia runtime w marshmallow https://developer.android.com/training/permissions/requesting.html
możesz sprawdzić informacje o aplikacji -> uprawnienia
czy Twoja aplikacja ma uprawnienia do zapisu w pamięci zewnętrznej, czy nie
źródło
Wygląda na to, że użytkownik odmówił pozwolenia, a aplikacja próbuje zapisać na dysku zewnętrznym, powodując błąd.
Sprawdź https://developer.android.com/training/permissions/requesting.html
Ten film daje lepsze wyobrażenie o UX, obsłudze uprawnień Runtime https://www.youtube.com/watch?v=iZqDdvhTZj0
źródło
Od wersji marshmallow programiści muszą prosić użytkownika o uprawnienia do wykonania. Pozwólcie, że przedstawię wam cały proces zadawania uprawnień w czasie wykonywania.
Używam odniesienia stąd: uprawnienia runtime marshmallow android .
Najpierw utwórz metodę, która sprawdza, czy wszystkie uprawnienia są nadane, czy nie
Oto kod, który jest uruchamiany po powyższej metodzie. Zastąpimy
onRequestPermissionsResult()
metodę:Jeśli użytkownik kliknie opcję Deny ,
showDialogOK()
metoda zostanie użyta do wyświetlenia okna dialogowegoJeśli użytkownik kliknie Odmów, a także kliknie pole wyboru z informacją „nigdy więcej nie pytaj” ,
explain()
metoda zostanie użyta do wyświetlenia okna dialogowego.metody wyświetlania okien dialogowych:
Powyższy fragment kodu prosi o podanie czterech uprawnień naraz. Możesz również poprosić o dowolną liczbę uprawnień w dowolnej działalności zgodnie z własnymi wymaganiami.
źródło
Po wielu poszukiwaniach ten kod działa dla mnie:
Sprawdź, czy uprawnienie już ma: Sprawdź uprawnienia WRITE_EXTERNAL_STORAGE Dozwolone czy nie?
Implementuj Override onRequestPermissionsResult do sprawdzania, czy użytkownik zezwala lub odmawia
źródło
to działa dla mnie
źródło
źródło
Przed rozpoczęciem pobierania sprawdź uprawnienia środowiska uruchomieniowego, a jeśli nie masz uprawnień, poproś o uprawnienia, takie jak ta metoda
requestStoragePermission ()
źródło
W prosty sposób pozwolenie można nadać za pomocą pliku manifest.xml, ale było ok do poziomu api 23 sdk w wersji 6, po tym, jak chcemy uzyskać pozwolenie, musimy poprosić o użycie, aby zezwolić które są potrzebne.
Po prostu dodaj ten kod do pliku mainActivity.java
Jeśli chcesz, zamień CAMERA lub dodaj WRITE_EXTERNAL_STORAGE z unikalnym kodem.
To jest prosty kod do uzyskania pozwolenia.
źródło