2016-02-04 15 views
7

Ho riscontrato alcuni problemi con i permessi di Android. Il problema è che onResume viene chiamato ogni volta che onRequestPermissionsResult è stato chiamato anche se l'utente ha già detto "Non chiedere più".Perché onResume viene chiamato dopo onRequestPermissionsResult?

Un esempio:

@Override 
    public void onResume() { 
    super.onResume(); 
    startLocationProvider(); 
    } 

    private void startLocationProvider() { 
    if (!locationService.requestLocationPermission(this, 0)) { 
     return; 
    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    if (requestCode == 0) { 
     if (grantResults.length == 1 && grantResults[ 0 ] == PackageManager.PERMISSION_GRANTED) { 
     startLocationProvider(); 
     } 
    } 

Funziona bene fino a quando l'utente seleziona "Mai chiedere di nuovo" e negano. Non so perché onResume viene chiamato ancora e ancora sebbene non venga mostrata all'utente alcuna finestra di dialogo.

+0

onResume viene chiamato dopo onRequestPermissionResult per consentire all'attività di prendere in considerazione la scelta dell'utente (autorizzazione concessa o negata) ed eseguire il codice di conseguenza. Ma ora il vero problema è perché, quando l'utente seleziona "Non chiedere più" e nega un'autorizzazione, onRequestPermissionsResult viene chiamato indefinitamente? Se trovi qualcosa per favore fammi sapere! –

+0

Provare a spostare il codice da onResume e in onStart. –

risposta

1

È necessario utilizzare shouldShowRequestPermissionRationale come parte dei controlli condizionali dopo aver controllato le autorizzazioni.

onResume viene chiamato per consentire di campionare i risultati di tale controllo di autorizzazione.

Questo vuole essere un stato tagliato di ciò che ho per un progetto cui sto lavorando:

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 

    if (grantResults.length > 0) { 
     if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
      // Permission Granted 
      pickDownloadFolder(); 
     } else if (grantResults[0] == PackageManager.PERMISSION_DENIED) { 
      // Permission Denied 
      if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
        Manifest.permission.WRITE_EXTERNAL_STORAGE)) { 
       result = "PERMISSION_DENIED"; 
       Intent returnIntent = new Intent(); 
       returnIntent.putExtra(resultKey, result); 
       setResult(RESULT_CANCELED, returnIntent); 
       finish(); 
      } else { 
       result = "PERMISSION_DENIED_FORCED"; 
       Intent returnIntent = new Intent(); 
       returnIntent.putExtra(resultKey, result); 
       setResult(RESULT_CANCELED, returnIntent); 
       finish(); 
      } 
     } 
    } 
} 
1

Avete provato a spostare la vostra richiesta permesso di ONSTART invece di onResume?

Problemi correlati