2016-03-14 5 views
31

Ho un frammento in cui sono presenti dati di riciclo e impostazione in questa panoramica di riciclaggio utilizzando l'adattatore Recyclerview.onRequestPermissionsResult che non viene chiamato in frammento se definito sia in frammento che in attività

Ora, ho un pulsante nella voce di elenco dell'adattatore che fa clic su cui ho bisogno di controllare il permesso READ_EXTERNAL_STORAGE in Android per il nuovo modello di permesso in Android.

Ho creato una nuova funzione nel frammento di questo adattatore per verificare se il permesso è concesso o meno e richiedere l'autorizzazione se non è già stato concesso.

Ho passato MyFragment.questo come un parametro in adattatore e chiamando il metodo del frammento sul pulsante clic in adattatore.

Ho usato il seguente codice per chiamare requestPermission in frammento.

if(ContextCompat.checkSelfPermission(mContext, Manifest.permission.READ_EXTERNAL_STORAGE) 
      != PackageManager.PERMISSION_GRANTED)){ 
     requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 
       ConstantVariables.READ_EXTERNAL_STORAGE); 
    } 

ho ignorato il metodo onRequestPermissionsResult nel frammento utilizzando il codice qui sotto:

@Override 
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case ConstantVariables.READ_EXTERNAL_STORAGE: 
      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

       // permission was granted, proceed to the normal flow. 
       startImageUploading(); 
      } else {} 

Ma non è sempre chiamato, invece di metodo onRequestPermissionsResult di questa attività è sempre chiamato.

Ho definito lo stesso metodo onRequestPermissionsResult anche nell'attività padre di frammento e viene richiamato.

Non riesco a rimuovere il metodo onRequestPermissionsResult dell'attività ma desidero richiamare il metodo onRequestPermissionsResult di fragment quando richiedo l'autorizzazione dal frammento. Come posso fare questo? Sto facendo qualcosa di sbagliato qui, per favore aiutatemi se qualcuno ha un'idea qui.

+1

riferiscono questo link [permessi runtime in frammento] (http://stackoverflow.com/questions/34342816/android-6-0-multiple-permissions/38563687#38563687) Questa è la soluzione esatta –

risposta

110

risposta A cura di coprire questioni più ampie

Penso che si sta confondendo il metodo di frammento e di attività. Ho avuto un problema simile il mio progetto lo scorso mese. Si prega di verificare se si ha finalmente la seguente:

  1. Nel AppCompatActivity utilizzare il metodo ActivityCompat.requestpermissions
  2. Nel frammento supporto v4 è necessario utilizzare requestpermissions
  3. Catch è se si chiama in AppcompatActivity.requestpermissions il tuo frammento quindi il callback arriverà all'attività e non al frammento
  4. Assicurati di chiamare super.onRequestPermissionsResult dall'attività onRequestPermissionsResult.

Vedere se è utile.

+3

Solo per ricontrollare assicurati di avere super.onrequestpermissionresult set nella tua attività – VarunJoshi129

+10

Aggiunta di 'super.onrequestpermissionresult 'nella richiesta di onrequestpermission 'nell'attività si chiama la richiesta di onrequestprement del frammento risultato quando richiedo il permesso usando 'requestpermissions'. Ora funziona, grazie mille .. :) –

+0

Accetta come risposta per chiudere il thread quindi – VarunJoshi129

-1

Questo problema è stato effettivamente causato da NestedFragments. Fondamentalmente nella maggior parte dei frammenti abbiamo esteso un HostedFragment che a sua volta estende un CompatFragment. Avere questi frammenti nidificati ha causato problemi che alla fine sono stati risolti da un altro sviluppatore nel progetto.

Stava facendo alcune cose di basso livello come po 'di commutazione per ottenere questo lavoro, quindi non sono troppo sicuro della soluzione reale finale

+0

Invece di copiare una risposta, è sufficiente fornire un collegamento: https://stackoverflow.com/a/33081173/630833 – jayeffkay

1
private void showContacts() { 
if (getActivity().checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) 
     != PackageManager.PERMISSION_GRANTED) { 
    requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 
      PERMISSIONS_REQUEST_READ_STORAGE); 
} else { 
    doShowContacts(); 
} 

}

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

}

cambio permesso

+2

Ciao utente2002721; il tuo codice potrebbe essere corretto, ma con qualche contesto sarebbe una risposta migliore; ad esempio, potresti spiegare come e perché questo cambiamento proposto risolverà il problema del questionario, forse includendo un link alla documentazione pertinente. Ciò lo renderebbe più utile per loro e anche più utile per altri lettori di siti che sono alla ricerca di soluzioni a problemi simili. –

0

Verificare che sia PERMISSION_REQUEST_CODE in onRequestPermissionsResult e all'interno dello Fragment contiene lo stesso valore.

1

Il metodo requestPermissions su Fragments richiede API livello 23 o superiore.
Se la vostra applicazione si rivolge a una versione inferiore è possibile utilizzare

FragmentCompat.requestPermissions(this, 
      new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 
      ConstantVariables.READ_EXTERNAL_STORAGE); 

In primo luogo è necessario aggiungere la dipendenza supporto-V13:

implementation "com.android.support:support-v13:$supportLibVersion"