Come richiedere le autorizzazioni a un servizio in Android Marshmallow


101

In Android Marshmallow, le autorizzazioni devono essere richieste in fase di esecuzione quando sono necessarie, anziché tutte in una volta quando viene installata un'app. Tuttavia, sembra che io possa richiedere autorizzazioni solo da un'attività, il che è un problema poiché la mia app contiene solo servizi. (Perché, potresti chiedere? L'app ha un quadrante Android Wear in bundle all'interno e tutto ciò che il telefono fa è cercare le foto nelle vicinanze da inviare all'orologio, nessuna attività necessaria. Ma richiede autorizzazioni di localizzazione.)

Quindi, esiste un modo per richiedere le autorizzazioni a un servizio? O in qualche modo forzare le autorizzazioni da concedere al momento dell'installazione come in passato?


questo problema anche all'interno della classe Application
itzhar

Prova questo potrebbe essere il lavoro stackoverflow.com/a/41221852/5488468
Bipin Bharti

La mia libreria per gestire facilmente le autorizzazioni di runtime da qualsiasi contesto e gestisce anche "Non chiedere più". github.com/nabinbhandari/Android-Permissions
Nabin Bhandari

Risposte:


47

requestPermission()può essere chiamato solo da an Activitye non a Service(diversamente da checkPermission()quello che richiede solo PackageManager). Quindi è necessario fare del lavoro extra per aggirare il problema; è necessario fornire un Activitynella tua app e, ad esempio, Servicepuoi verificare le autorizzazioni di cui ha bisogno e se non sono ancora state concesse, può creare una notifica e che può informare l'utente con un breve messaggio descrittivo sul motivo una notifica e cosa deve accadere quando fanno clic sulla notifica, ecc.


Questa è la soluzione proposta da Benjamin Poiesz . Puoi ascoltare questo podcast dalle 23:40
xiaomi

Puoi anche chiamare requestPermission () all'interno di fragment.
Misagh Emamverdi

3
Qual è la soluzione per il caso di un servizio in background in esecuzione che controlla periodicamente gli aggiornamenti della posizione e disattivo l'autorizzazione alla posizione nelle impostazioni. Poiché non c'è attività, il mio servizio si
arresta

1
@ stud91 Come minimo, individua le eccezioni di sicurezza o le autorizzazioni di query ogni volta che richiedi aggiornamenti di posizione. Ciò impedirà alla tua app di bloccarsi (anche se non otterrai alcuna posizione se l'autorizzazione è stata revocata). Ancora meglio: controlla i permessi e, se mancano, visualizza una notifica che porta l'utente a un'attività che è solo un segnaposto per la finestra di dialogo delle autorizzazioni.
user149408

8
Ecco come l'ho risolto: github.com/mvglasow/satstat/blob/master/src/com/vonglasow/… Può essere chiamato da qualsiasi Contextimplementazione OnRequestPermissionsResultCallback. La funzionalità è simile allo standard requestPermission().
user149408

15

Sono d'accordo, questo è molto fastidioso per i servizi, penso che dovresti segnalare un problema nella pagina Anteprima per sviluppatori Android per questo.

Al momento, penso che la soluzione migliore sia verificare l'autorizzazione al servizio e mostrare la notifica se manca l'autorizzazione. Ancora meglio, crea un DialogActivity per richiedere l'autorizzazione quando gli utenti premono sulla notifica.


7

Dai un'occhiata alla libreria PermissionEverywhere . Ti consente di richiedere l'autorizzazione da qualsiasi contesto.

Crea una notifica cliccando sulla quale apre un'attività che richiede un'autorizzazione.

Codice di esempio dalla pagina GitHub della libreria: -

@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
Ho provato la versione asincrona in un servizio e non ha funzionato. onComplete non è mai stato chiamato
Leo Droidcoder

Buona idea, ma non è disponibile nel repository
naXa

2
Questo pacchetto ha funzionato per me, grazie per il suggerimento. Noterei, tuttavia, che non ho provato la versione asincrona. Inoltre, per coloro che hanno problemi nell'utilizzo PermissionEverywhere, assicurati di dichiarare l'attività di supporto nel tuo manifest E assicurati che quando lo dichiari, sia legato al pacchetto corretto (se stai usando PermissionEverywherecome pacchetto separato). Mi ci è voluto molto tempo per rendermi conto che in realtà non stavo specificando il PermissionEverywherepacchetto nel manifest.
user3570982

Ho eseguito PermissionEverywherel'app demo di e non ha funzionato.
Ixx

2

C'è una libreria molto semplice che permette di fare esattamente questo. Puoi verificare le autorizzazioni da qualsiasi luogo (anche da un servizio), a seconda che l'app sia in primo piano o in background, mostra una normale finestra di dialogo o genera una notifica che richiede le autorizzazioni. Il codice è davvero facile da capire ed è anche molto facile da usare.

Provalo: permessi Android


-2

È possibile utilizzare ResultReceiverper creare un destinatario della risposta degli utenti, quindi passarlo come richiamata all'attività, tramite le notifiche PendingIntent. Riferimento

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.