Jak zażądać uprawnień od usługi w Android Marshmallow


101

W systemie Android Marshmallow żądania uprawnień należy żądać w czasie wykonywania, gdy są potrzebne, zamiast wszystkich naraz podczas instalowania aplikacji. Jednak wydaje mi się, że żądam uprawnień tylko od działania, co jest problemem, ponieważ moja aplikacja zawiera tylko usługi. (Dlaczego tak jest, możesz zapytać? Aplikacja ma w zestawie tarczę zegarka Android Wear, a jedyne, co robi telefon, to wyszukiwanie zdjęć w pobliżu, aby wysłać je do zegarka - nie jest wymagana żadna aktywność. Ale wymaga uprawnień do lokalizacji).

Czy jest więc sposób zażądania uprawnień od usługi? Lub w jakiś sposób wymusić przyznanie uprawnień w czasie instalacji, tak jak w przeszłości?


ten problem również w klasie Application
itzhar

Wypróbuj to może być praca stackoverflow.com/a/41221852/5488468
Bipin Bharti

Moja biblioteka do łatwej obsługi uprawnień środowiska uruchomieniowego z dowolnego kontekstu, a także obsługuje „Nie pytaj ponownie”. github.com/nabinbhandari/Android-Permissions
Nabin Bhandari

Odpowiedzi:


47

requestPermission()można wywołać tylko z an, Activitya nie a Service(w przeciwieństwie do checkPermission()tego wymaga tylko PackageManager). Musisz więc wykonać dodatkową pracę, aby to obejść; musisz podać Activityw swojej aplikacji i na przykład Servicesprawdzić, czy uprawnienia, których potrzebuje, a jeśli nie zostały jeszcze nadane, może utworzyć powiadomienie i poinformować użytkownika za pomocą opisowej krótkiej wiadomości, dlaczego powiadomienie i co musi się stać, gdy klikną powiadomienie itp.


Takie rozwiązanie zaproponował Benjamin Poiesz . Możesz słuchać tego podcastu od 23:40
xiaomi,

Możesz również wywołać requestPermission () wewnątrz fragmentu.
Misagh Emamverdi

3
Jakie jest rozwiązanie w przypadku działającej usługi w tle, sprawdzającej okresowo aktualizacje lokalizacji i po prostu wyłączam uprawnienia lokalizacji w ustawieniach. Ponieważ nie ma żadnej aktywności, powoduje to awarię mojej usługi po ponownym otwarciu aplikacji
stud91,

1
@ stud91 Przynajmniej łapaj wyjątki bezpieczeństwa lub sprawdzaj uprawnienia za każdym razem, gdy żądasz aktualizacji lokalizacji. Zapobiegnie to awariom aplikacji (chociaż nie otrzymasz żadnych lokalizacji, jeśli pozwolenie zostało cofnięte). Jeszcze lepiej: sprawdź uprawnienia, a jeśli ich nie ma, wyświetl powiadomienie, które przenosi użytkownika do działania, które jest tylko symbolem zastępczym okna dialogowego uprawnień.
user149408,

8
Oto jak to rozwiązałem: github.com/mvglasow/satstat/blob/master/src/com/vonglasow/ ... Można go wywołać z dowolnego, Contextktóry również implementuje OnRequestPermissionsResultCallback. Funkcjonalność zbliżona do standardowej requestPermission().
user149408

15

Zgadzam się, jest to bardzo kłopotliwe dla usług, myślę, że powinieneś zgłosić problem na stronie Android Developer Preview w tym zakresie.

W tej chwili myślę, że najlepszym rozwiązaniem jest sprawdzenie pozwolenia na serwis i wyświetlenie powiadomienia, jeśli brakuje pozwolenia. Co więcej, utwórz DialogActivity, aby poprosić o pozwolenie, gdy użytkownicy naciskają powiadomienie.


7

Zajrzyj do biblioteki PermissionEverywhere . Pozwala poprosić o pozwolenie z dowolnego kontekstu.

Tworzy powiadomienie, po kliknięciu którego otwiera działanie z prośbą o pozwolenie.

Przykładowy kod ze strony github biblioteki: -

@Override
  protected Boolean doInBackground(Void... params) {
      PermissionResponse response = PermissionEverywhere.getPermission(getApplicationContext(), 
      new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
              REQ_CODE,
              "Notification title", 
              "This app needs  a write permission", 
              R.mipmap.ic_launcher)
              .call();
      //waits..
      boolean isGranted = response.isGranted();

      if(isGranted){ //changed from isGrante to isGranted
      // Do stuff
      }
  }

1
Próbowałem wersji asynchronicznej w usłudze i nie działa. onComplete nigdy nie był nazywany
Leo Droidcoder

Dobry pomysł, ale nie jest dostępny w repozytorium
naXa

2
Ten pakiet działał dla mnie, dzięki za sugestię. Chciałbym jednak zauważyć, że nie próbowałem wersji asynchronicznej. Ponadto, dla tych, którzy mają problemy z używaniem PermissionEverywhere, upewnij się, że deklarujesz aktywność pomocnika w swoim manifeście ORAZ upewnij się, że kiedy ją deklarujesz, jest ona powiązana z odpowiednim pakietem (jeśli używasz PermissionEverywherejako oddzielnego pakietu). Zajęło mi dużo czasu, zanim zdałem sobie sprawę, że tak naprawdę nie określałem PermissionEverywherepakietu w manifeście.
user3570982

Uruchomiłem PermissionEverywhereaplikację demonstracyjną i nie działa.
Ixx

3

Istnieje bardzo prosta biblioteka, która pozwala to zrobić. Możesz sprawdzić uprawnienia z dowolnego miejsca (nawet z usługi), w zależności od tego, czy aplikacja działa na pierwszym planie, czy w tle, wyświetla normalne okno dialogowe lub generuje powiadomienie z prośbą o uprawnienia. Kod jest naprawdę łatwy do zrozumienia i bardzo łatwy w użyciu.

Spróbuj: uprawnienia Androida


-2

Możesz użyć, ResultReceiveraby utworzyć odbiorcę odpowiedzi użytkowników, a następnie przekazać ją jako oddzwonienie do działania, za pośrednictwem powiadomień PendingIntent. Odniesienie

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.