2015-10-14 7 views
9

Uso un MediaScannerConnection per chiamare il suo metodo scanFile, per aggiungere immagini alla galleria del dispositivo. Ma in Android 6 ricevo questo eccezioni quando ho eseguirlo:MediaScannerConnection non riesce su Android 6 a causa del rifiuto dell'autorizzazione

E/DatabaseUtils: java.lang.SecurityException: Permesso Denial: lettura com.android.providers.media.MediaProvider uri contenuto : // supporti/esterna/fs_id da pid = 22984, uid = 10078 richiede android.permission.READ_EXTERNAL_STORAGE, o grantUriPermission()

e

e/iu.UploadsManager: java.lang.SecurityExceptio n: Permesso negazione: lettura com.android.providers.media.MediaProvider uri contenuto: // media/esterno/fs_id da pid = 22984, uid = 10078 richiede android.permission.READ_EXTERNAL_STORAGE, o grantUriPermission()

Qualsiasi aiuto?

+0

sto affrontando lo stesso problema. Sto cercando di caricare video su Youtube, ma ho ricevuto lo stesso errore. Hai trovato la soluzione? – TOP

+0

No. Ho notato che quando faccio una foto con WhatsApp, in una chat, posso vedere lo stesso errore in LogCat. Quindi forse questo è un problema di Android 6 a causa delle nuove autorizzazioni di runtime .... –

+0

Ho provato ad aggiungere flag Intent.FLAG_GRANT_READ_URI_PERMISSION ma sembra non funzionare. – TOP

risposta

0

Questo è il risultato dei nuovi modi di gestire le autorizzazioni. La tua app deve ora chiedere il permesso di runtime ed essere pronta per essere respinta.

nel vostro onCreate (o dovunque) di controllare e, eventualmente, chiedere il permesso:

  if (ContextCompat.checkSelfPermission(this, 
      Manifest.permission.READ_EXTERNAL_STORAGE) 
      != PackageManager.PERMISSION_GRANTED) { 

     // Should we show an explanation? 
     if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
       Manifest.permission.READ_EXTERNAL_STORAGE)) { 

      // Show an expanation to the user *asynchronously* -- don't block 
      // this thread waiting for the user's response! After the user 
      // sees the explanation, try again to request the permission. 

     } else { 

      // No explanation needed, we can request the permission. 

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

      // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an 
      // app-defined int constant. The callback method gets the 
      // result of the request. 
     } 
    } 

poi essere pronti ad accettare le autorizzazioni in questo modo:

@Override 
public void onRequestPermissionsResult(int requestCode, 
             String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case MY_PERMISSIONS_REQUEST_READ_MEDIA: { 
      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 
        && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
      } else { 
       // permission denied, boo! Disable the 
       // functionality that depends on this permission. 
      } 
      return; 
     } 
    } 
} 
+0

Nop. Come vedi l'eccezione non viene lanciata dalla mia app, ma DatabaseUtils e UploadsManager. E le autorizzazioni di runtime non influiscono sulla mia app (ancora) perché non sto prendendo di mira l'API 23. La risposta –

+0

è ancora pertinente per i problemi elencati ed è utile agli altri che si imbattono in un problema simile. Ho svitato per rimuovere il downvote. C'è un modo per impostare le autorizzazioni una volta che copre tutti gli eventi in un'app? piuttosto che dover capire dove l'app potrebbe aver bisogno di chiedere una premessa? – Theo

Problemi correlati