2015-07-19 12 views

risposta

4

No, non è possibile. Quello che puoi fare è inviare una notifica dove l'utente può toccare e quindi usare un'attività per richiedere/gestire l'autorizzazione (magari con il tema del dialogo).

+1

L'attività di configurazione è anche un buon posto per occuparsi di questo. Sebbene l'utente possa andare alla schermata delle autorizzazioni e revocare qualsiasi autorizzazione precedentemente assegnata, sarebbe comunque necessario l'approccio alla notazione. Prenderò in considerazione la possibilità di inserire il widget in uno stato dell'interfaccia utente con revoca delle autorizzazioni come approccio alternativo. –

1

È possibile richiedere solo l'autorizzazione da Attività o da frammento.

Individua un punto nella tua attività o frammento in cui ritieni che l'app richiederà un'autorizzazione, quindi chiama il metodo requestPermission. l'invio di notifiche non funzionerà perché desideri che il tuo codice venga elaborato fino a quando non ottieni le autorizzazioni richieste e poi riprendi la tua funzionalità dal metodo onRequestPermissionResult().

4

penso che sia possibile richiedere un permesso di fuori di un'attività, fino a quando si utilizza il metodo

ActivityCompat.requestPermissions (Activity activity, String[] permissions, int requestCode)

dalla libreria di supporto e passa l'attività come parametro del metodo.

Ad esempio:

ActivityCompat.requestPermissions(targetActivity, new String[] {Manifest.permission.CAMERA}, PERMISSION_REQUEST_CODE); 

dove targetActivity è l'attività che dovrebbe implementare il metodo:

onRequestPermissionsResult (int requestCode, String[] permissions, int[] grantResults)

Questo è il metodo che gestirà de risultato richiesta l'autorizzazione.

+16

Fuori attività indica un servizio o un BroadcastReceiver, in cui non si dispone di un'attività. Questa risposta non aiuta affatto. –

+0

In generale è possibile passare un oggetto di contesto a una classe non di attività e utilizzarlo quando è necessario un contesto e non si dispone di un'attività. Chiedere permessi è comunque una storia diversa. – Pedram

+0

@Gabe su un lato sei corretto, ma dall'altra parte, la domanda non indica da dove l'interrogante vuole chiamare la richiesta. Quindi penso che questa sia una risposta corretta. – Opiatefuchs

8

Se si desidera richiedere l'autorizzazione dall'esterno dell'attività è possibile creare classi diverse ed estendere la classe da Attività. Usa il costrutto per ottenere e impostare il contesto per la classe.

public class Permissions extends Activity { 

private static final int MY_PERMISSIONS_WRITE_EXTERNAL_STORAGE = 1; 
private Context context; 

public Permissions(Context context) { 
    this.context = context; 
} 
public void checkWriteExternalStoragePermission() { 
    final int MY_PERMISSIONS_REQUEST_PHONE_CALL = 1; 
    ContextCompat.checkSelfPermission(context,  Manifest.permission.WRITE_EXTERNAL_STORAGE); 
    if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
     ActivityCompat.requestPermissions((Activity) context, 
       new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 
       MY_PERMISSIONS_WRITE_EXTERNAL_STORAGE); 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 
    switch (requestCode) { 

     case MY_PERMISSIONS_WRITE_EXTERNAL_STORAGE: { 
      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       Toast.makeText(context, "Permission Granted", Toast.LENGTH_SHORT).show(); 
      } else { 
       Toast.makeText(context, "Permission Denied", Toast.LENGTH_SHORT).show(); 
      } 
      return; 

     } 
     // other 'case' lines to check for other 
     // permissions this app might request 
    } 
} 
} 

Ora creare creare oggetto e passare il contesto al costruttore ovunque sia necessario richiedere le autorizzazioni.

Permissions permissions = new Permissions(SplashScreen.this); 
    permissions.checkWriteExternalStoragePermission(); 
+3

Tuttavia, c'è un aspetto negativo di questo approccio che l'oggetto può mantenere il riferimento del contesto di attività anche dopo che l'attività è stata distrutta, il che potrebbe portare a perdite di memoria. –

+6

Questo è un imbroglio. Il tuo codice in realtà non usa il fatto che Autorizzazioni è un'attività, dato che non lo passi a requestPermissions(). Se lo facessi, fallirebbe. Invece si passa il contesto dato a requestPermissions(), assumendo che si tratti di un'attività. Ma il punto della domanda è: cosa fare se non c'è alcuna attività? – Lev

+7

Solo un avvertimento per coloro che non sanno meglio, non usare questo codice! –

-1

È possibile chiamare requestPermissions() dall'esterno dell'attività, ma nella classe si dovrebbe avere il contesto di tale attività.

ActivityCompat.requestPermissions((Activity)context, new String[]{permission.READ_PHONE_STATE}, REQUEST_CODE); 

Per funzionare, è necessario implementare sotto metodo nella vostra attività

onRequestPermissionsResult (int requestCode, String[] permissions, int[] grantResults) 

In modo che questo metodo di sostituzione ottenere eseguire quando tap utente sul consentire o tasto negare sul pop up

0

È possibile utilizzare la libreria Easy Permissions.

Android richiede che queste richieste provengano da un Activity. Con Permessi Semplici questo non è più un problema, puoi richiedere l'autorizzazione da qualsiasi posto purché fornisca Context. Inoltre, se si richiede un'autorizzazione già concessa, l'utente non verrà richiesto.

enter image description here

divulgazione completa, la nostra azienda gestisce e sviluppa questo libero da usare biblioteca. Detto questo, siamo fiduciosi che sia uno strumento utile e non lo condivideremo diversamente.

+0

Questo non ha alcun senso per me. Se Android aveva davvero l'esigenza di utilizzare un'attività per richiedere permessi, la tua biblioteca doveva essere pura magia perché poteva fare l'impossibile. La verità è che usi un contesto. È lo stesso come fa lo standard checkSelfPermission(). Non riesco a vedere il vero vantaggio nell'usare una libreria di terze parti per questo controllo dei permessi. Forse mi manca qualcosa ... –

+0

@TheincredibleJan Grazie per averci contattato. Android richiede un 'Activity'. 'Context' è necessario per la libreria, come fanno molte librerie - è magica ma è ancora basata nel mondo reale :). Il più grande vantaggio è che puoi richiedere di abilitare un'autorizzazione da qualsiasi luogo, anche una classe che non sia un 'Attività'. Inoltre, l'ultima versione ti permetterà di abilitare automaticamente tutte le autorizzazioni presenti nel tuo file 'Manifest'. C'è una app di esempio sulla pagina GitHub; se hai qualche minuto dovresti assolutamente verificarlo. Per favore fateci sapere se avete altre domande. –