Zgodnie z tym: http://developer.android.com/preview/features/runtime-permissions.html#coding aplikacja może sprawdzać uprawnienia do wykonywania i żądać uprawnień, jeśli nie została jeszcze przyznana. Wyświetlone zostanie następujące okno dialogowe:
W przypadku, gdy użytkownik odrzuci ważne pozwolenie, aplikacja imo powinna wyświetlić wyjaśnienie, dlaczego pozwolenie jest potrzebne i jaki wpływ ma spadek. To okno dialogowe ma dwie opcje:
- spróbuj ponownie (prośba o pozwolenie ponownie)
- odmowa (aplikacja będzie działać bez tego pozwolenia).
Jeśli jednak użytkownik sprawdzi Never ask again
, drugie okno dialogowe z wyjaśnieniem nie powinno być wyświetlane, zwłaszcza jeśli użytkownik już raz odmówił. Teraz pytanie brzmi: skąd moja aplikacja wie, czy użytkownik to sprawdził Never ask again
? IMO onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
nie podaje mi tych informacji.
Drugie pytanie brzmiałoby: czy Google planuje wprowadzić niestandardowy komunikat w oknie dialogowym zezwolenia, który wyjaśnia, dlaczego aplikacja potrzebuje pozwolenia? W ten sposób nigdy nie będzie drugiego dialogu, który z pewnością poprawiłby UX.
źródło
Odpowiedzi:
Wersja zapoznawcza dla deweloperów 2 wprowadza pewne zmiany w sposobie żądania uprawnień przez aplikację (patrz także http://developer.android.com/preview/support.html#preview2-notes ).
Pierwsze okno dialogowe wygląda teraz tak:
Nie ma pola wyboru „Nigdy nie pokazuj ponownie” (w przeciwieństwie do wersji 1 dla programistów). Jeśli użytkownik odmówi pozwolenia i jeśli zezwolenie jest niezbędne dla aplikacji, może wyświetlić inne okno dialogowe wyjaśniające powód, dla którego aplikacja prosi o takie pozwolenie, np. W następujący sposób:
Jeśli użytkownik ponownie odmówi, aplikacja powinna się zamknąć, jeśli absolutnie potrzebuje tego pozwolenia, lub kontynuować działanie z ograniczoną funkcjonalnością. Jeśli użytkownik ponownie rozważy (i wybierze ponowną próbę), prośba o pozwolenie zostanie ponownie zażądana. Tym razem monit wygląda następująco:
Po raz drugi wyświetlane jest pole wyboru „Nigdy więcej nie pytaj”. Jeśli użytkownik ponownie zaprzecza, a pole wyboru jest zaznaczone, nic więcej nie powinno się wydarzyć. To, czy pole wyboru jest zaznaczone, można określić za pomocą Activity.shouldShowRequestPermissionRationale (String), np. W następujący sposób:
Tak mówi dokumentacja Androida ( https://developer.android.com/training/permissions/requesting.html ):
Aby wiedzieć, czy użytkownik odmówił za pomocą opcji „nigdy więcej nie pytaj”, możesz ponownie sprawdzić metodę shouldShowRequestPermissionRationale w swoim polu onRequestPermissionsResult, gdy użytkownik nie udzielił pozwolenia.
Możesz otworzyć ustawienia aplikacji za pomocą tego kodu:
Nie ma możliwości wysłania użytkownika bezpośrednio na stronę autoryzacji.
źródło
Możesz sprawdzić
shouldShowRequestPermissionRationale()
w swoimonRequestPermissionsResult()
.https://youtu.be/C8lUdPVSzDk?t=2m23s
Sprawdź, czy zezwolenie zostało udzielone czy nie
onRequestPermissionsResult()
. Jeśli nie, sprawdźshouldShowRequestPermissionRationale()
.true
pokaż wyjaśnienie, dlaczego potrzebne jest to uprawnienie. Następnie w zależności od wyboru użytkownika ponownierequestPermissions()
.false
to pokaż komunikat o błędzie, że zezwolenie nie zostało udzielone i aplikacja nie może kontynuować pracy lub określona funkcja jest wyłączona.Poniżej znajduje się przykładowy kod.
Najwyraźniej mapy Google robią to właśnie w celu uzyskania zezwolenia na lokalizację.
źródło
Oto przyjemna i łatwa metoda sprawdzenia aktualnego stanu uprawnień:
Ostrzeżenie: zwraca BLOCKED_OR_NEVER_ASKED przy pierwszym uruchomieniu aplikacji, zanim użytkownik zaakceptuje / odmówi uprawnienia w wierszu polecenia (na urządzeniach SDK 23+)
Aktualizacja:
Biblioteka obsługi Androida wydaje się teraz mieć bardzo podobną klasę,
android.support.v4.content.PermissionChecker
która zawieracheckSelfPermission()
zwracającą:źródło
BLOCKED_OR_NEVER_ASKED
jeśli nie zażądano jeszcze pozwolenia.android.content.pm
już definiujePERMISSION_GRANTED = 0
iPERMISSION_DENIED = -1
. Może zestawBLOCKED_OR_NEVER_ASKED = PERMISSION_DENIED - 1
czy coś?Gdy użytkownik zaznaczy „Nie pytaj ponownie”, pytanie nie może być ponownie wyświetlone. Można jednak wyjaśnić użytkownikowi, że wcześniej odmówił pozwolenia i musi udzielić pozwolenia w ustawieniach. Odwołaj go do ustawień za pomocą następującego kodu:
źródło
Może być przydatny dla kogoś: -
Zauważyłem, że jeśli sprawdzimy flagę shouldShowRequestPermissionRationale () w metodzie wywołania zwrotnego onRequestPermissionsResult (), pokażą tylko dwa stany .
Stan 1: -Powrót prawda: - Za każdym razem, gdy użytkownik kliknie Odmów uprawnień (w tym za pierwszym razem).
Stan 2: -Wraca zwraca fałsz: - jeśli użytkownik wybierze „nigdy więcej nie pyta”.
Link do szczegółowego przykładu roboczego
źródło
onRequestPermissionsResult
, a nie wtedy, gdy faktycznie poprosisz o pozwolenie.Możesz to ustalić , sprawdzając, czy uzasadnienie uprawnień ma być wyświetlane w
onRequestPermissionsResult()
metodzie wywołania zwrotnego. A jeśli znajdziesz jakieś zezwolenie, aby nigdy więcej nie pytać , możesz poprosić użytkowników o przyznanie uprawnień z ustawień.Moja pełna implementacja byłaby jak poniżej. Działa zarówno z jednym, jak i wieloma żądaniami uprawnień. Skorzystaj z poniższych lub bezpośrednio z mojej biblioteki.
źródło
Jeśli chcesz wykryć wszystkie „stany” (po raz pierwszy odmowa, po prostu odmowa, po prostu odmowa z „Nigdy nie pytaj ponownie” lub trwałe odrzucenie), możesz wykonać następujące czynności:
Utwórz 2 booleany
Ustaw pierwszy przed pytaniem o pozwolenie:
Ustaw drugi w swojej metodzie onRequestPermissionsResult:
Użyj poniższej „tabeli”, aby zrobić wszystko, czego potrzebujesz w onRequestPermissionsResult () (po sprawdzeniu, że nadal nie masz uprawnień):
źródło
// TRUE FALSE
występuje również, gdy użytkownik zezwala na pozwolenie po uprzednim odmowie.Miałem ten sam problem i zrozumiałem. Aby uprościć życie, napisałem klasę util do obsługi uprawnień środowiska wykonawczego.
A metody PreferenceUtil są następujące.
Teraz wystarczy użyć metody * checkPermission * z odpowiednimi argumentami.
Oto przykład,
Jeśli użytkownik zaznaczy Nigdy nie pytaj ponownie , otrzymasz oddzwonienie na onPermissionDisabled .
Miłego kodowania :)
źródło
shouldShowRequestPermissionRationale
, zapisując preferencję żądania wysłanego do użytkownika. Miałem ten sam pomysł i znalazłem twoją odpowiedź. Niezły robotnikPełne wyjaśnienie każdego przypadku zezwolenia
źródło
Przydatna funkcja pozwalająca ustalić, czy nie można żądać (w Kotlinie) arbitralnego pozwolenia:
Użycie tego wymaga ustawienia wspólnego logicznego ustawienia preferencji z nazwą żądanego uprawnienia (np.
android.Manifest.permission.READ_PHONE_STATE
)true
Na pierwsze żądanie zezwolenia.Wyjaśnienie:
Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
ponieważ część kodu można uruchomić tylko na poziomie API 23+.ContextCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED
aby sprawdzić, nie mamy jeszcze pozwolenia.!activity.shouldShowRequestPermissionRationale(permission)
aby sprawdzić, czy użytkownik odrzucił aplikację, pytając ponownie. Ze względu na dziwactwa tej funkcji wymagany jest również następujący wiersz.PreferenceManager.getDefaultSharedPreferences(activity).getBoolean(permission, false)
służy to (wraz z ustawieniem wartości true na pierwsze żądanie zezwolenia) w celu rozróżnienia stanów „Nigdy nie pytano” i „Nigdy więcej nie pytaj”, ponieważ poprzedni wiersz nie zwraca tej informacji.źródło
Proszę, nie rzucaj we mnie kamieniami za to rozwiązanie.
To działa, ale jest nieco „hacky”.
Kiedy dzwonisz
requestPermissions
, zarejestruj bieżącą godzinę.Następnie w
onRequestPermissionsResult
jeśli wynik nie zostanie przyznany, sprawdź ponownie czas.
Ponieważ użytkownik nie mógł tak szybko kliknąć przycisku odmowy, wiemy, że wybrał opcję „nigdy więcej nie pytaj”, ponieważ oddzwanianie jest natychmiastowe.
Używaj na własne ryzyko.
źródło
Metoda powinnaShShRRequestPermissionRationale () można wykorzystać do sprawdzenia, czy użytkownik wybrał opcję „nigdy więcej nie pytał” i odmówił pozwolenia. Istnieje wiele przykładów kodu, więc wolałbym wyjaśnić, jak go używać do takiego celu, ponieważ myślę, że jego nazwa i implementacja sprawiają, że jest to bardziej skomplikowane niż w rzeczywistości.
Jak wyjaśniono w części Żądanie uprawnień w czasie wykonywania , ta metoda zwraca wartość true, jeśli opcja „nigdy więcej nie pytaj” jest widoczna, w przeciwnym razie wartość false; więc zwraca wartość false przy pierwszym wyświetleniu okna dialogowego, a następnie po raz drugi zwraca wartość true, i tylko wtedy, gdy użytkownik odmówi uprawnienia, wybierając opcję, w tym momencie ponownie zwraca wartość false.
Aby wykryć taki przypadek, możesz wykryć sekwencję fałsz-prawda-fałsz lub (prościej) możesz mieć flagę, która śledzi początkowy czas wyświetlania okna dialogowego. Następnie metoda ta zwraca true lub false, gdzie false pozwoli ci wykryć, kiedy wybrana jest opcja.
źródło
Napisałem skrót dla prośby o pozwolenie w Androidzie M. Ten kod obsługuje również wsteczną kompatybilność ze starszymi wersjami Androida.
Cały brzydki kod jest wyodrębniany do fragmentu, który dołącza się i odłącza do działania z żądaniem uprawnień. Możesz użyć
PermissionRequestManager
w następujący sposób:Zobacz: https://gist.github.com/crysxd/385b57d74045a8bd67c4110c34ab74aa
źródło
źródło
Wypróbuj tę prostą bibliotekę uprawnień. Obsługuje wszystkie operacje związane z uprawnieniami w 3 łatwych krokach. Oszczędzało mi to czas. Możesz zakończyć wszystkie prace związane z pozwoleniami w 15 minut .
Może obsłużyć Odmów, Może obsłużyć Nigdy więcej nie pytaj, Może wywołać ustawienia aplikacji w celu uzyskania zgody, Może dać wiadomość wymierną, Może dać wiadomość odmowy, Może podać listę zaakceptowanych uprawnień, Może podać listę odmowy uprawnienia itp.
https://github.com/ParkSangGwon/TedPermission
Krok 1: dodaj swoją zależność
Krok 2: Zapytaj o uprawnienia
Krok 3: obsłużyć odpowiedź uprawnień
źródło
możesz ładnie słuchać.
Słuchacz
MainClass o pozwolenie
Używany w ten sposób
przesłonić onRequestPermissionsResult w aktywności lub fragmnet
źródło
Zamiast tego otrzymasz oddzwonienie
onRequestPermissionsResult()
jako PERMISSION_DENIED, gdy ponownie poprosisz o pozwolenie, gdy popełnisz błądshouldShowRequestPermissionRationale()
Z dokumentu Androida:
Gdy system poprosi użytkownika o udzielenie pozwolenia, użytkownik może powiedzieć mu, aby nie pytał o to pozwolenie ponownie. W takim przypadku za każdym razem, gdy aplikacja
requestPermissions()
ponownie zażąda tego pozwolenia, system natychmiast odrzuca żądanie. System wywołujeonRequestPermissionsResult()
metodę wywołania zwrotnego i przechodziPERMISSION_DENIED
w ten sam sposób, jak gdyby użytkownik ponownie wyraźnie odrzucił żądanie. Oznacza to, że kiedy zadzwoniszrequestPermissions()
, nie możesz zakładać, że miała miejsce jakakolwiek bezpośrednia interakcja z użytkownikiem.źródło
Możesz użyć
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)
metody wykrywania, czy opcja Nigdy nie pytaj jest zaznaczona, czy nie.Więcej informacji: sprawdź to
Aby sprawdzić, czy masz wiele uprawnień, użyj:
Metoda replace ()
Powyższy kod pokaże także okno dialogowe, które przekieruje użytkownika do ekranu ustawień aplikacji, z którego może on wyrazić zgodę, jeśli zaznaczył przycisk Nigdy więcej nie pytaj.
źródło
Możesz użyć
wewnątrz
Zobacz przykład poniżej:
Sprawdź, czy ma uprawnienia, gdy użytkownik kliknie przycisk:
Gdy użytkownik odpowie na okno dialogowe uprawnień, przejdziemy do onRequestPermissionResult:
źródło
Chciałbym również uzyskać informację, czy użytkownik wybrał opcję „nigdy więcej nie pytaj”. Osiągnąłem „prawie rozwiązanie” z brzydko wyglądającą flagą, ale zanim powiem ci, jak to zrobić, powiem ci o mojej motywacji:
Na początku chciałbym zaoferować uprawnienia dotyczące funkcjonalności. Jeśli użytkownik korzysta z niego i nie ma żadnych uprawnień, otrzymuje albo 1 okno dialogowe z góry, albo 2 i 3. Gdy użytkownik wybierze opcję „Nigdy więcej nie pytaj”, chciałbym wyłączyć tę funkcję i wyświetlić ją inaczej. - Moje działanie jest wywoływane przez wpisywanie tekstu tarczy, chciałbym również dodać „(Odwołanie uprawnień)” do wyświetlanego tekstu etykiety. To pokazuje użytkownikowi: „Istnieje funkcjonalność, ale nie mogę jej używać ze względu na moje ustawienia uprawnień”. Nie wydaje się to jednak możliwe, ponieważ nie mogę sprawdzić, czy wybrano opcję „Nigdy więcej nie pytaj”.
Doszedłem do rozwiązania, w którym mogę żyć, mając zawsze włączoną funkcjonalność z aktywnym sprawdzaniem uprawnień. Wyświetlam komunikat Toast w onRequestPermissionsResult () w przypadku negatywnej odpowiedzi, ale tylko wtedy, gdy nie pokazałem mojego niestandardowego wyskakującego uzasadnienia. Jeśli więc użytkownik wybrał opcję „Nigdy więcej nie pytaj”, otrzyma tylko wiadomość toast. Jeśli użytkownik niechętnie wybierze opcję „nigdy więcej nie pytaj”, otrzymuje tylko niestandardowe uzasadnienie i wyskakujące okienko z prośbą o pozwolenie przez system operacyjny, ale nie wznosi toastu, ponieważ trzy powiadomienia z rzędu byłyby zbyt uciążliwe.
źródło
Muszę wdrożyć dynamiczne uprawnienia do kamery. W przypadku wystąpienia 3 możliwych przypadków: 1. Zezwól, 2. Odmowa, 3. Nie pytaj ponownie.
źródło
Rozwijając powyższą odpowiedź mVck , następująca logika określa, czy „Nigdy więcej nie pytaj” zostało sprawdzone dla danego Żądania Pozwolenia:
który jest fragmentem poniżej (pełny przykład zobacz tę odpowiedź )
źródło
możesz przeczytać oficjalny dokument Androida Zażądaj uprawnień aplikacji
lub możesz znaleźć wiele popularnych bibliotek uprawnień Androida na Github
źródło
Aby dokładnie odpowiedzieć na pytanie: Co się stanie, gdy użytkownik naciśnie „Nigdy więcej nie pytaj”?
Przesłonięta metoda / funkcja
Tablica grantResult okazuje się być pusta, więc możesz coś tam zrobić? Ale nie najlepsza praktyka.
Jak obsługiwać „Nigdy więcej nie pytaj”?
Pracuję z Fragmentem, który wymagał pozwolenia READ_EXTERNAL_STORAGE.
Pozostałe funkcje są banalne.
źródło