Przeglądałem oficjalny dokument dotyczący nowego modelu uprawnień w systemie Android M. Mówi on o shouldShowRequestPermissionRationale()
funkcji, która zwraca, true
jeśli aplikacja zażądała wcześniej tego uprawnienia, a użytkownik odmówił. Jeśli użytkownik odrzucił prośbę o pozwolenie w przeszłości i wybrał opcję Nie pytaj ponownie, ta metoda zwraca false
.
Ale jak możemy rozróżnić następujące dwa przypadki?
Przypadek 1 : Aplikacja nie ma uprawnień, a użytkownik nie był wcześniej pytany o zgodę. W tym przypadku shouldShowRequestPermissionRationale () zwróci wartość false, ponieważ jest to pierwsze pytanie użytkownika.
Przypadek 2 : Użytkownik odmówił pozwolenia i wybrał „Nie pytaj ponownie”, w tym przypadku również polecenieShowRequestPermissionRationale () zwróci false.
Chciałbym odesłać użytkownika do strony ustawień aplikacji w przypadku 2. Jak mam się zabrać do rozróżnienia tych dwóch przypadków?
źródło
shouldShowRequestPermissionRationale()
w tym przypadku zwraca fałsz, co zaszkodzi każdemu kodowi opartemu na flagi „czy pytałem wcześniej”.permissions
systemie Android. github.com/android/permissions-samplesOdpowiedzi:
Po M Podgląd 1, jeśli okno dialogowe jest wyświetlane po raz pierwszy , nie ma pola wyboru Nigdy więcej nie pytaj .
Jeśli użytkownik odrzuci prośbę o pozwolenie, w oknie dialogowym uprawnień pojawi się pole wyboru Nigdy nie pytaj ponownie, gdy po raz drugi zostanie zażądany pozwolenie.
Więc logika powinna wyglądać następująco:
Prośba o pozwolenie:
Sprawdź, czy zezwolenie zostało odrzucone lub udzielone w
onRequestPermissionsResult
.Jeśli wcześniej odmówiono pozwolenia, tym razem w oknie dialogowym uprawnień pojawi się pole wyboru Nigdy nie pytaj ponownie .
Zadzwoń,
shouldShowRequestPermissionRationale
aby sprawdzić, czy użytkownik zaznaczył Nigdy nie pytaj ponownie .shouldShowRequestPermissionRationale
metoda zwraca wartość false tylko wtedy, gdy użytkownik wybrał opcję Nigdy nie pytaj ponownie lub zasady dotyczące urządzeń zabraniają aplikacji posiadania tego uprawnienia:Nie musisz więc śledzić, czy użytkownik zaznaczył Nigdy więcej nie pytaj, czy nie.
źródło
context
wActivityCompat.shouldShowRequestPermissionRationale(...)
parametrze jest rzeczywiście typuActivity
. Może nie wpłynąć na was wszystkich, ale w moim przypadku tak.should
wywołania zwrotnego ORAZ zapisania jej wartości przeciwnej w NVM tylko po to, aby wiedzieć, czy muszę ponownie poprosić o żądanie przy następnym uruchomieniu aplikacji! ... wow (facepalm) ... czy wykonanie tylko jednego wywołania zwracającego wyliczenie statusu było zbyt trudne?Miałem ten sam problem i rozgryzłem go. Aby znacznie uprościć życie, napisałem klasę util do obsługi uprawnień w czasie wykonywania.
A metody PreferenceUtil są następujące.
Teraz wystarczy użyć metody checkPermission z odpowiednimi argumentami.
Oto przykład,
Otrzymasz oddzwonienie onPermissionAsk dla przypadku 1 i onPermissionDisabled dla przypadku 2.
Miłego kodowania :)
źródło
public void onPermissionAsk() { ActivityCompat.requestPermissions( thisActivity, ...
.thisActivity
to nic innegoYourActivity.this
.context
używasz?shouldShowRequestPermissionRationale(permission)
nie istnieje wandroid.content.Context
. jest w ActivityCompatAKTUALIZACJA
Uważam, że poniższa odpowiedź CanC jest właściwa, której należy przestrzegać. Jedynym sposobem, aby się upewnić, jest zweryfikowanie tego w wywołaniu zwrotnym onRequestPermissionResult przy użyciu metody shouldShowPermissionRationale.
==
Moja pierwotna odpowiedź:
Jedynym sposobem, który znalazłem, jest samodzielne śledzenie, czy jest to pierwszy raz, czy nie (np. Przy użyciu wspólnych preferencji). Jeśli to nie pierwszy raz, użyj
shouldShowRequestPermissionRationale()
do rozróżnienia.Zobacz też: Android M - sprawdź uprawnienia runtime - jak sprawdzić, czy użytkownik zaznaczył „Nigdy więcej nie pytaj”?
źródło
Tak jak rozumiem, shouldShowRequestPermissionRationale () uruchamia szereg przypadków użycia pod maską i powiadamia aplikację, czy wyświetlić wyjaśnienie dotyczące żądanych uprawnień.
Ideą uprawnień Run Time jest to, że przez większość czasu użytkownik powie „Tak” prośbie o pozwolenie. W ten sposób użytkownik będzie musiał wykonać tylko jedno kliknięcie. Oczywiście żądanie powinno być używane w odpowiednim kontekście - tj. Pytając o pozwolenie kamery po naciśnięciu przycisku „Kamera”.
Jeśli użytkownik odrzuci żądanie, ale po jakimś czasie nadejdzie i ponownie wciśnie przycisk „Aparat”, funkcja shouldShowRequestPermissionRationale () zwróci wartość „prawda”, więc aplikacja może wyświetlić sensowne wyjaśnienie, dlaczego żąda się pozwolenia, a dlaczego nie. działają poprawnie bez niego. Zwykle w tym oknie dialogowym pojawia się przycisk, aby ponownie odmówić / zdecydować później, oraz przycisk, aby udzielić uprawnień. Przycisk przyznania uprawnień w oknie dialogowym uzasadnienia powinien ponownie uruchomić prośbę o pozwolenie. Tym razem użytkownik będzie miał również pole wyboru „Nigdy więcej nie pokazuj”. Jeśli zdecyduje się go wybrać i ponownie odmówi pozwolenia, powiadomi system Android, że użytkownik i aplikacja nie znajdują się na tej samej stronie. Ta akcja miałaby dwie konsekwencje - shouldShowRequestPermissionRationale () zawsze zwróci false,
Ale jest też inny możliwy scenariusz, w którym można by użyć onRequestPermissionsResult. Na przykład niektóre urządzenia mogą mieć zasady dotyczące urządzeń, które wyłączają kamerę (działa dla CIA, DARPA itp.). Na tych urządzeniach onRequestPermissionsResult zawsze zwróci wartość false, a metoda requestPermissions () dyskretnie odrzuci żądanie.
Właśnie to zebrałem, słuchając podcastu z Benem Poieszem - menedżerem produktu na platformie Android.
http://androidbackstage.blogspot.jp/2015/08/episode-33-permission-mission.html
źródło
Po prostu opublikuj inną opcję, jeśli ktoś ma na to ochotę. Możesz użyć EasyPermissions, które zostało dostarczone przez samą Google, aby, jak powiedziano, „uprościć uprawnienia systemu Android M”.
Wtedy nie musisz zajmować się
shouldShowRequestPermissionRationale
bezpośrednio.źródło
permissionPermanentlyDenied
wewnętrzne tylko wywołujeshouldShowPermissionsRationale
i zwracatrue
w przypadku, gdy użytkownik nigdy nie był proszony o przyznanie uprawnień.Jeśli ktoś jest zainteresowany rozwiązaniem Kotlin, refaktoryzowałem odpowiedź @muthuraj, aby być w Kotlinie. Zmodernizowano go również nieco, aby zamiast słuchaczy miał blok uzupełniania.
PermissionUtil
PermissionHandler
Realizacja
źródło
Sprawdź tę implementację. działa dla mnie całkiem nieźle. po prostu sprawdzasz uprawnienia w metodzie checkPermissions () przekazując listę uprawnień. Sprawdzasz wynik żądania uprawnień w onRequestPermissionsResult (). Implementacja pozwala ująć oba przypadki, gdy użytkownik wybierze „nigdy więcej nie pytaj” lub nie. W tej implementacji, jeśli se wybierze „nigdy więcej nie pytaj”, w oknie dialogowym pojawi się opcja przeniesienia go do działania ustawień aplikacji.
Cały ten kod znajduje się w moim fragmencie. Pomyślałem, że lepiej byłoby utworzyć wyspecjalizowaną klasę do tego celu, na przykład PermissionManager, ale nie jestem tego pewien.
źródło
Może być przydatny dla kogoś: -
Zauważyłem, że jeśli sprawdzimy flagę shouldShowRequestPermissionRationale () w metodzie wywołania zwrotnego onRequestPermissionsResult (), to pokazuje tylko dwa stany.
Stan 1: -Return true: - Za każdym razem, gdy użytkownik kliknie opcję Odmów uprawnień (w tym za pierwszym razem).
Stan 2: -Zwraca fałsz: - jeśli użytkownik wybierze „nigdy więcej nie pyta”.
Link do szczegółowego przykładu roboczego .
źródło
Możemy to zrobić w ten sposób?
źródło
shouldShowRequestPermissionRationale
dla zezwolenia SPECJALNEGO zawsze zwracają PRAWDA TYLKO po tym, jak użytkownik odmówił tego bez pola wyboruInteresuje nas wartość FAŁSZ
Więc są 3 przypadki utracone z fałszywą wartością:
1. wcześniej nie było takiej akcji, a teraz użytkownik decyduje się wyrazić zgodę lub odmówić.
Proszę określić preferencje
ASKED_PERMISSION_*
, które nie istnieją obecnie i będzie prawdą wonRequestPermissionsResult
na to zacząć w każdym razie zgodzić się lub odmówićWięc chociaż ta preferencja nie istnieje, nie ma powodu, aby to sprawdzać
shouldShowRequestPermissionRationale
2. użytkownik kliknął zgodę.
Po prostu zrób:
Która zwróci prawdę i nie ma powodu, aby to sprawdzać
shouldShowRequestPermissionRationale
3. użytkownik kliknął przycisk „odmów” za pomocą pola wyboru (pytanie o drugi lub więcej razy)
Nadszedł CZAS na pracę, z
shouldShowRequestPermissionRationale
którym wróci FAŁSZ(preferencja istnieje i nie mamy pozwolenia)
źródło
Ten kod prosi użytkownika o pozwolenie w czasie wykonywania, jeśli użytkownik na to zezwala, wykonuje metodę wyniku, jeśli użytkownik odmówi, pyta ponownie z opisem z odmową użytkownika (pyta ponownie z instrukcjami), ale jeśli użytkownik wybierze, nigdy więcej nie pytaj. obsługuje nigdy nie pytaj ponownie, wyświetla opcję otwartych ustawień z instrukcjami.
źródło