Aktualizuję naszą aplikację, aby korzystać z nowego systemu uprawnień do uruchamiania M. Wszystko działa oprócz onRequestPermissionsResult (). Muszę sprawdzić uprawnienia po naciśnięciu przycisku, a jeśli się powiedzie, wyślij wiadomość tekstową. Po udzieleniu pozwolenia okno to zamyka się, ale nie uruchamia wysyłania tekstu, dopóki ponownie nie naciśnie przycisku.
Debugowałem i ustawiłem punkty przerwania w metodzie onRequestPermissionsResult (), ale nigdy do niej nie wchodzi.
Ta metoda jest wywoływana jako pierwsza:
private void askForPermission() {
String[] permissions = new String[]{Manifest.permission.SEND_SMS};
ActivityCompat.requestPermissions(getActivity(), permissions, PERMISSIONS_CODE);
}
A potem mój telefon zwrotny wygląda następująco:
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PERMISSIONS_CODE) {
for (int i = 0; i < permissions.length; i++) {
String permission = permissions[i];
int grantResult = grantResults[i];
if (permission.equals(Manifest.permission.SEND_SMS)) {
if (grantResult == PackageManager.PERMISSION_GRANTED) {
onPPSButtonPress();
} else {
requestPermissions(new String[]{Manifest.permission.SEND_SMS}, PERMISSIONS_CODE);
}
}
}
}
}
Czy ktoś napotkał podobny problem? Doceń wszelką pomoc w tym zakresie. Dzięki
źródło
Fragment.requestPermissions()
działanie nadrzędne faktycznie otrzymujeonRequestPermissionsResult()
. (To jest z biblioteką wsparcia 23.3.0)Możesz spróbować:
Jeśli wywołujesz ten kod z fragmentu, ma on własną metodę requestPermissions. Uważam, że problem polega na tym, że wywołujesz metodę statyczną.
Pro Wskazówka, jeśli chcesz
onRequestPermissionsResult()
fragmentu:FragmentCompat.requestPermissions(Fragment fragment, String[] permissions, int requestCode)
źródło
Mam nadzieję, że działa dobrze
Do działania:
Dla fragmentu:
źródło
Też napotkałem ten problem. Jeśli chcesz, aby działanie, które obsługuje uprawnienia, którego nie ma w historii / ostatnich, będzie Cię kusiło, aby zmienić
AndroidManifest.xml
wpis.Jeśli ustawisz aktywność, do której dzwonisz
requestPermissions
lub zaAppCompatActivity.requestPermissions
pomocąw waszych
AndroidManifest.xml
czasachonRequestPermissionsResult()
nie będziecie wezwani. Dzieje się tak, jeśli twoja działalność pochodzi zActivity
lubAppCompatActivity
.Można to naprawić, usuwając obie flagi z „AndroidManifest.xml” i
finishAndRemoveTask()
zamiast tego kończąc swoją aktywność .źródło
Jeśli masz
onRequestPermissionsResult
zarówno aktywność, jak i fragment, pamiętaj, aby wywołaćsuper.onRequestPermissionsResult
aktywność. Nie jest wymagany fragmentem, ale jest aktywny.źródło
FragmentActivity.onRequestPermissionsResult(..)
jest to miejsce, do któregoonRequestPermissionsResult(..)
przekazywane jest wezwanie do fragmentu .Nieaktualne odpowiedzi znajdują się na stronie : https://developer.android.com/training/permissions/requesting
Wewnątrz fragmentu musisz wywołać:
Nie:
źródło
Jeśli używasz requestPermissions we fragmentach, akceptuje 2 parametry zamiast 3.
Powinieneś użyć
requestPermissions(permissions, PERMISSIONS_CODE);
źródło
Jeśli z jakiegoś powodu rozszerzyłeś niestandardowe działanie znajdujące się w bibliotece zewnętrznej, która nie wywołuje super, będziesz musiał ręcznie wywołać Fragment super.onRequestPermissionsResult sam w swoim działaniu onRequestPermissionsResult.
źródło
Masz funkcję checkPermissions dla urządzeń przed Marshmallow w FragmentCompat . Używam w ten sposób:
źródło
Odkryłem, że ważne jest, gdzie dzwonisz
android.support.v4.app.Fragment.requestPermissions
.Jeśli to zrobisz
onCreate()
,onRequestPermissionsResult()
nigdy nie zostanie wywołane.Rozwiązanie: Zadzwoń
onActivityCreated()
;źródło
onActivityCreated()
do mojego kodu. SDK 23.onPause()
?Ten problem był spowodowany przez NestedFragments. Zasadniczo większość fragmentów rozszerzyliśmy HostedFragment, który z kolei rozszerza CompatFragment. Posiadanie tych zagnieżdżonych fragmentów spowodowało problemy, które ostatecznie zostały rozwiązane przez innego programistę w projekcie.
Robił pewne rzeczy na niskim poziomie, takie jak przełączanie bitów, aby to zadziałało, więc nie jestem zbyt pewien ostatecznego rozwiązania
źródło
źródło
To zadziała ...
źródło
Jeśli wywołujesz ten kod z fragmentu, ma on własną metodę requestPermissions.
Podstawowa koncepcja brzmi: jeśli jesteś w działaniu, zadzwoń
a jeśli we fragmencie, po prostu zadzwoń
źródło
FragmentCompat.requestPermissions()
.Miałem podobny problem, z wyjątkiem tego, że naciskałem przycisk, aby nawiązać połączenie, co wyzwala interwał połączenia. Najpierw sprawdziłem uprawnienia, jeśli nie otrzymałem, proszę o pozwolenie, a onRequestPermissionResult wywołuję uprawnienie do sprawdzania i ponownie dzwonię.
źródło
Na podstawie odpowiedzi goodgamerguy rozwiązanie jest następujące:
źródło
Zanim sprawdzisz wszystko zgodnie z powyższymi odpowiedziami, upewnij się, że kod żądania nie jest równy 0 !!!
sprawdź kod onRequestPermissionsResult () w FragmentActivity.java:
źródło
źródło
Mam niesamowite rozwiązanie, aby to osiągnąć, wykonaj BaseActivity w ten sposób.
}
Teraz możesz zadzwonić na kod, aby poprosić o pozwolenie w ten sposób
Teraz za każdym razem, gdy dzieje się to gdziekolwiek, czy to w twoim fragmencie, czy w jakiejkolwiek aktywności, wywoływana jest aktywność podstawowa.
Dzięki
źródło
Możesz użyć
requestPermissions(PERMISSIONS, MULTIPLE_PERMISSIONS_CODE);
. Nie używaj FragmentCompat, jeśli używasz v4.źródło
Detale
Algorytm
moduł - kamera, lokalizacja, ....
funkcje
Rozwiązanie
Wykorzystanie w działaniu (w tym samym fragmencie)
źródło
Tutaj chcę pokazać mój kod, jak to zrobiłem.
Tutaj w tej klasie chcę sprawdzić, czy zezwolenie zostało udzielone czy nie. Czy nie zadzwonię po pozwolenie z mojej MainActivity jak
Teraz w metodzie onCreate musisz wywołać funkcję requestForPermission ().
To wszystko. Możesz także poprosić o wiele uprawnień jednocześnie.
źródło
AKTUALIZACJA: zobaczyłem czyjąś odpowiedź na temat wywołania
super.onRequestPermissionResult()
w działaniu i to naprawia problem z kodem żądania, o którym wspomniałem i wywołuje onRequestPermissionResult fragmentu.zignoruj te rzeczy:
Dla mnie to wywoływało
onRequestPermissionResult
działanie pomimo mojego wywołaniafragment.requestPermission(...)
, ALE zwróciło wynik z niepoprawnym kodem żądania (111 zmieniło się w 65647 dlaczego ??? Nigdy się nie dowiem).Na szczęście jest to jedyne zezwolenie, którego żądamy na tym ekranie, więc po prostu zignoruję kod żądania (nie mam czasu, aby dowiedzieć się, dlaczego jest on teraz nieprawidłowy)
źródło
Zetknąłem się również z problemem, który nawet jeśli wywołasz poprawne polecenie requestPermissions, nadal może mieć ten problem. Problem polega na tym, że aktywność rodzica może zastąpić tę metodę bez wywoływania super. Dodaj super, a zostanie to naprawione.
źródło