5

Sto cercando di leggere percorsi delle immagini dalla memoria e mi continuo a ricevere il SecurityException qui:non può richiedere l'autorizzazione READ_EXTERNAL_STORAGE

Caused by: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=31409, uid=10053 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission() 

sto compilazione contro api 23 e disporre delle autorizzazioni chiaramente affermato nel mio manifesto come diretta figlio del mio Manifesto. Capisco anche che i nuovi permessi di runtime affermano che devi chiedere l'autorizzazione durante il runtime quando vuoi accedere allo storage. Quando scrivo questa linea che avrebbe cominciato il controllo per l'autorizzazione ho un problema non può risolvere nell'IDE:

ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) 

non permette di risolvere il simbolo Manifest.permission.READ_EXTERNAL_STORAGE. L'unica Manifest.permission che posso chiaramente indicare nel mio codice è Manifest.permission.C2D_MESSAGE senza ottenere un errore di risoluzione del problema. C'è qualcos'altro che ho bisogno di compilare per avere accesso agli altri permessi nel codice?

Giusto per essere chiari questo è il blocco di codice che mi sta dando la SecurityException:

public List<String> getCameraImagesFull(Context context) { 
     Cursor cursor = null; 
     String[] star = {"*"}; 
     ArrayList<String> result = new ArrayList<>(); 
     cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, star, null, null, MediaStore.MediaColumns.DATE_ADDED + " DESC"); 
     if (cursor != null) { 
      if (cursor.moveToFirst()) { 
       do { 
        String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA)); 
        result.add(path); 
       } while (cursor.moveToNext()); 
      } 
      cursor.close(); 
     } 
     return result; 
    } 

questa è la linea che genera l'eccezione:

cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, star, null, null, MediaStore.MediaColumns.DATE_ADDED + " DESC"); 

e qui ci sono tutte le autorizzazioni dichiarato nel mio manifest:

<permission 
     android:name="com.example.gcm.permission.C2D_MESSAGE" 
     android:protectionLevel="signature" /> 

    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
    <uses-permission android:name="android.permission.USE_CREDENTIALS" /> 
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 
    <uses-permission android:name="com.example.gcm.permission.C2D_MESSAGE" /> 

mi sto solo chiedendo come vado a richiedere quella perm ission in modo da poter ottenere i percorsi dell'immagine. Funziona tutto quando eseguo la compilazione di qualsiasi build di Lollipop, solo con le nuove autorizzazioni di runtime su Marshmallow per ottenere SecurityExeption. Qualsiasi aiuto è apprezzato, grazie in anticipo

+0

Penso che tu stia affrontando questo problema in Android 6.0 Marshmallow, sto anche affrontando lo stesso problema ma non sono in grado di richiedere il permesso di lettura per l'archiviazione esterna, hai trovato qualche modo? – Herry

+0

Ok l'ho trovato dal tuo commento qui sotto rispondi. – Herry

+0

Ciao Prova questo per API Livello 23 http://stackoverflow.com/a/41221852/5488468 –

risposta

9

non può risolvere simbolo Manifest.permission.READ_EXTERNAL_STORAGE

È necessario aggiungere un'istruzione import per android.Manifest, allo stesso modo si fa con qualsiasi altra classe Java .

L'unica Manifest.permission che posso indicare chiaramente nel mio codice è Manifest.permission.C2D_MESSAGE senza ottenere una non può risolvere l'errore

Non v'è alcun tale valore (C2D_MESSAGE) in android.Manifest.permission. Non so nemmeno dove ci sia una classe Manifest, con una classe interna , con un campo denominato C2D_MESSAGE.

+0

grazie, vedo ora quando mi riferivo a Manifest.permission lo stavo usando dal mio pacchetto app rispetto al pacchetto Android. .... posso usare READ_EXTERNAL_STORAGE finché lo dichiaro come 'android.Manifest.permission.READ_EXTERNAL_STORAGE' vs 'Manifest.permission.READ_EXTERNAL_STORAGE' –

Problemi correlati