5

Ho un progetto in cui chiedo 2 permessi all'avvio. Nel debug, funziona come previsto fino a quando non effettua la seconda chiamata a requestPermissions. Non appena lo fa, il primo spara lo onRequestPermissionsResult con un array vuoto grantResults.Chiamare requestPermissions due volte su chiamate kernel personalizzate suRequestPermissionsResult prima della risposta dell'utente

Questo ha funzionato bene fino ad oggi. L'unica cosa che posso pensare sono gli aggiornamenti che ho fatto oggi. Ho aggiornato ad Android SDK Platform Tools 23.1 e aggiornato il mio Mac a El Capitan.

Qualcuno può aiutarmi a risolvere qualsiasi problema?

Codice segue:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.blank_layout); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     int hasCameraPermissions = checkSelfPermission(android.Manifest.permission.CAMERA); 
     if (hasCameraPermissions != PackageManager.PERMISSION_GRANTED) { 
      requestPermissions(new String[]{android.Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION_CODE); 
     } 
     int hasStoragePermissions = checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE); 
     if (hasStoragePermissions != PackageManager.PERMISSION_GRANTED) { 
      requestPermissions(new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_STORAGE_PERMISSION_CODE); 
     } 
     if (hasCameraPermissions == PackageManager.PERMISSION_GRANTED && hasStoragePermissions == PackageManager.PERMISSION_GRANTED) { 
      startCameraIntent(); 
     } 
    } else { 
     startCameraIntent(); 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    switch (requestCode) { 
     case REQUEST_CAMERA_PERMISSION_CODE: 
      if (grantResults[0] != PackageManager.PERMISSION_GRANTED) { 
       Toast.makeText(this, R.string.camera_denied, Toast.LENGTH_LONG).show(); 
       quitAfter5(); 
      } 
      break; 
     case REQUEST_STORAGE_PERMISSION_CODE: 
      if (grantResults[0] != PackageManager.PERMISSION_GRANTED) { 
       Toast.makeText(this, R.string.storage_denied, Toast.LENGTH_LONG).show(); 
       quitAfter5(); 
      } 
      break; 
    } 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     int hasCameraPermissions = checkSelfPermission(android.Manifest.permission.CAMERA); 
     int hasStoragePermissions = checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE); 
     if (hasCameraPermissions == PackageManager.PERMISSION_GRANTED && hasStoragePermissions == PackageManager.PERMISSION_GRANTED) { 
      startCameraIntent(); 
     } 
    } 
} 

EDIT :: La modifica che ha causato questo incidente è stato il fatto che avevo installato il kernel personalizzato ElementalX sul mio Nexus 5 pochi giorni prima. Ho confermato il problema proprio ieri su Nexus 6 di mio fratello usando lo stesso kernel. Ho intenzione di scattare una email allo sviluppatore del kernel per vedere cosa ne dice.

Come nella risposta, il codice sopra rappresenta in realtà il metodo errato per utilizzare comunque il metodo requestPermissions. Quindi tutti lo fanno nel modo giusto e funzioneranno per tutti i dispositivi :)

+2

Um, perché non effettuare una sola chiamata a 'requestPermissions()'? Dopotutto, ci vuole una serie di nomi di permessi. – CommonsWare

+0

@CommonsWare Quindi lo fa ... Immagino che funzionerà allora. Ancora non spiega perché il mio codice ha funzionato bene fino ad oggi però. – RayfenWindspear

+0

@CommonsWare Se lo pubblichi come risposta lo accetto. Ho trovato la tua guida alle autorizzazioni e l'ho seguita ora. Inoltre, ho scoperto il motivo per cui il mio codice non funziona ora. Deve essere correlato al kernel personalizzato che ho recentemente installato sul mio dispositivo. Dovrò mandare loro un bug report, anche se passare in una lista è come dovrebbero essere controllate le autorizzazioni. – RayfenWindspear

risposta

5

Lo scenario migliore che mi aspetterei da due chiamate consecutive a requestPermissions() è che vengano visualizzate due finestre di dialogo consecutive. Non mi aspetterei il comportamento che stai vedendo. Ho effettuato chiamate multiple simili a requestPermissions(), in modo da non gestire correttamente le modifiche alla configurazione e sono state visualizzate entrambe le edizioni della finestra di dialogo.

A parità di tutti gli altri, è meglio richiedere solo tutte le autorizzazioni in requestPermissions(), quindi c'è una singola finestra di dialogo. Ciò si adatta meglio alle aspettative degli utenti e penso che semplificherà un po 'il tuo codice.

+1

Ho avuto alcuni strani problemi su Android Marshmallow quando ho chiesto due diverse autorizzazioni in due chiamate diverse contemporaneamente all'avvio di un'app (il programma si è bloccato un paio di volte). Chiedendo entrambi in una requestPermissions() sembrava risolvere il problema. – Matthias

Problemi correlati