Riprendiamo l'esempio visto nel paragrafo precedente e proviamo ora a scriverlo con l'uso di PermissionDispatcher. PermissionDispatcher richiede di annotare l'activity che richiede il permesso e il metodo che richiede il permesso con due annotazioni: @RuntimePermissions
e @NeedsPermission
. Quest'ultima annotazione richiedeun elenco di permessi necessari al metodo (nel nostro caso è solo uno).
@RuntimePermissions
public class MainActivity extends AppCompatActivity {
/**
* Metodo associato all'evento click di un pulsante che richiede l'uso della CAMERA
*/
@NeedsPermission(Manifest.permission.CAMERA)
void showCamera() {
// utilizza permesso
}
// Bisogna visualizzare dialog per richiedere il permesso?
@OnShowRationale(Manifest.permission.CAMERA)
void showRationaleForCamera(final PermissionRequest request) {
new AlertDialog.Builder(this)
.setMessage(R.string.permission_camera_rationale)
.setPositiveButton(R.string.button_allow, (dialog, button) -> request.proceed())
.setNegativeButton(R.string.button_deny, (dialog, button) -> request.cancel())
.show();
}
// permesso rifiutato
@OnPermissionDenied(Manifest.permission.CAMERA)
void showDeniedForCamera() {
Toast.makeText(this, R.string.permission_camera_denied, Toast.LENGTH_SHORT).show();
}
@OnNeverAskAgain(Manifest.permission.CAMERA)
void showNeverAskForCamera() {
Toast.makeText(this, R.string.permission_camera_neverask, Toast.LENGTH_SHORT).show();
}
}
PermissionDispatcher: funzionamento
Permission Dispatcher usa un processore di annotazione e delle annotazioni per generare per noi il codice necessario a gestire il flusso delle operazioni necessarie a gestire correttamente i permessi a partire da Android 6.0.
E' bene tener presente che la libreria funziona anche per le versioni del robottino verde inferiori alla 6.0. In questo ultimo caso, la libreria considererà sempre come accettata la richiesta dei permessi. Vediamo ora le principali annotazioni che la libreria mette a disposizione:
- @RuntimePermissions: Abilita un fragment o una activity a gestire i permessi
@RuntimePermissions
public class MainActivity extends AppCompatActivity {
...
}
@NeedsPermission(Manifest.permission.CAMERA)
public void showCamera() {
// utilizza permesso
}
@OnShowRationale(Manifest.permission.CAMERA)
void showRationaleForCamera(final PermissionRequest request) {
new AlertDialog.Builder(this)
.setMessage(R.string.permission_camera_rationale)
.setPositiveButton(R.string.button_allow, (dialog, button) -> request.proceed())
.setNegativeButton(R.string.button_deny, (dialog, button) -> request.cancel())
.show();
}
Il processore di annotazione quando trova un componente di tipo activity
o fragment
annotato con @RuntimePermissions
, genera in automatico una classe per la gestione dei permessi aggiungendo al suo nome il prefisso PermissionsDispatcher
.
Per fare un esempio di quanto appena detto: per una activity denominata ContactActivity
, la classe generata avrà il nome ContactActivityPermissionsDispatcher
.
La classe generata deve essere usata in fase di creazione e di distruzione dell'activity o del fragment con un codice simile a quello riportato:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button_camera).setOnClickListener(v - > {
// NOTE: delegate the permission handling to generated method
MainActivityPermissionsDispatcher.showCameraWithPermissionCheck(this);
});
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
// NOTE: delegate the permission handling to generated method
MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
}
PermissionDispatcher è disponibile su GitHub indirizzo. In allegato all'articolo si trova un progetto d'esempio che illustra come utilizzare questa libreria per gestire i permessi in un'applicazione.