2015-07-15 21 views
13

Io gioco con l'anteprima M e testò la mia app su di esso, in particolare la parte "salva un file in una memoria esterna". Prima del download/salvataggio avviato il processo, chiedo perAnteprima Android M: l'attività viene ricreata dopo l'autorizzazione concessa

Manifest.permission.WRITE_EXTERNAL_STORAGE 

autorizzazione come descritto nella pagina degli sviluppatori: https://developer.android.com/preview/features/runtime-permissions.html

la finestra di verifica come previsto:

"Allow <AppName> to access photos, media, and files on your device?" Deny/Allow 

Se mi ha colpito la " deny "-button, viene chiamato il metodo onRequestPermissionsResult dell'attività.

Se si preme il pulsante "allow", l'attività viene prima ricreata e successivamente viene chiamato il metodo onRequestPermissionsResult. Penso che sia il risultato del permesso concesso.

Ma la seconda situazione è difficile perché voglio innescare un callback che avvia il download, ma questo oggetto è nullo, a questo punto:

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

    getLogger().error("onRequestPermissionsResult (" + requestCode + ", " + permissions + ", " + grantResults + ")"); 
    switch (requestCode) { 


     //permission for saving files? 
     case PermissionCode.WRITE_EXTERNAL_STORAGE: { 


      if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

       //HERE IS THE NULL-OBJECT 
       if (controller != null) { 

        controller.triggerCallback(); 
       } 
      } 
      break; 
     } 
     default: { 

      super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     } 
    } 
} 

Quindi le mie domande sono:

  1. Can Evito questa ricreazione?
  2. Se no, come posso ridisegnare il mio codice per risolvere il problema - Sono totalmente alcun ideale al momento

EDIT 1:

ho cercato di risolvere il problema con un gestore e postDelayed - ma l'ho saltato.

EDIT 2:

ho preliminare risolto e mostrano un brindisi per utente con la richiesta di premere nuovamente il pulsante di download (in caso di autorizzazione concessa). Ma Google: SEI SERIO?

EDIT 3:

No ricreazione accade con l'ultimo SDK 6.0 (Versione 23) - forse qualcuno ha ascoltato il mio pianto a Mountain View :-)

+0

Ehi, come è andata a finire? Sto compilando anche la versione 23, e sto ancora affrontando il riavvio delle attività su permesso di consentire e negare. Il metodo onRequestPermissionsResult non viene mai chiamato. Sto chiamando requestPermissions() da un frammento. Questo fa qualche differenza? –

+0

@Mayur Altro: come revocare/concedere l'autorizzazione? Quando revocando/concedendo le impostazioni delle app interne, ho ancora tempo libero dopo aver ripreso ad app. Ma all'interno del flusso di lavoro dell'app - come descritto sopra - non si verifica alcuna ricreazione ... –

+0

non importa, l'ho risolto. –

risposta

1

È sempre possibile controllare le condizioni scaricabile immediatamente dopo l'attività si ricrea in onCreate():

static final int MY_PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE = 0; 
boolean initiateDownload = false; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if(savedInstanceState != null) { 
     initiateDownload = savedInstanceState.getBoolean("toDownload"); 
    } 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    final boolean hasPermission = checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) 
      == PackageManager.PERMISSION_GRANTED; 
    if(initiateDownload && hasPermission) { 
     // start download here... 
    } else { 
     requestPermissions(new String[]{WRITE_EXTERNAL_STORAGE}, 
       MainActivity.MY_PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE); 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    if(requestCode == MY_PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE) { 
     if(grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
      initiateDownload = true; 
     } else { 
      // denied permission... 
     } 
    } 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putBoolean("toDownload", initiateDownload); 
} 
+0

thx per il tuo aiuto, ma guarda la mia modifica! –