18

Ho due attività nella mia app, MainActivity chiama ImagePicker, che ha una GridView che espone tutte le immagini nella galleria del telefono, dove utilizzo ContentResolver per ottenere il cursore.SecurityException: Permissione Denial: lettura (solo su emulatore)

Ha funzionato bene sul mio telefono quando l'ho provato, ma si è bloccato istantaneamente ogni volta sull'emulatore.

Ecco il log degli errori:

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

io ho il permesso scritto nel manifesto, come illustrato di seguito:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme"> 
    <activity 
     android:name=".MainActivity" 
     android:label="@string/app_name" 
     android:exported="true"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

    <activity android:name=".ImagePicker" /> 
</application> 
+0

tenta di specificare lo spazio di archiviazione sd card durante la creazione emulatore. – userDroid

+0

Mi spiace, come faccio? L'ho impostato su 1G. – TPWang

risposta

23

Quale versione di Android è l'emulatore? E stai compilando con SDK 23? Se l'emulatore è Marshmallow, è necessario verificare esplicitamente l'autorizzazione in fase di runtime. Ciò è dovuto al nuovo modello di autorizzazioni.

Scopri i documenti sui permessi per ulteriori informazioni: https://developer.android.com/training/permissions/index.html

+0

Grazie! Questo ha risolto il mio problema! – TPWang

+0

Questo non spiega perché funziona su dispositivi normali – Day

3

Se la versione di destinazione app è 23 allora vi darà questo errore, se il requisito include livello di API 23, allora avete bisogno di fare bersaglio 23 e necessità per controllare i permessi in modo dinamico qui è l'esempio dal check sito degli sviluppatori https://developer.android.com/training/permissions/requesting.html

Nota:anche se si dà bersaglio 22 o più basso anche la vostra applicazione funziona con il 23 senza questo (controllare il permesso) errore.

14

Before calling method, check for permission.

private void checkPermission(){ 
    int permissionCheck = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE); 

    if (permissionCheck != PackageManager.PERMISSION_GRANTED) {  
     ActivityCompat.requestPermissions(   
    getActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, Constants.WRITE_EXTERNAL_STORAGE); 
    } else {  
     callMethod(); 
    } 
} 

Check permission result.

@Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
     switch (requestCode) { 

      case Constants.WRITE_EXTERNAL_STORAGE: 
       if ((grantResults.length > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) { 
        callMethod(); 
       } 
       break; 

      default: 
       break; 
     } 
    } 
+0

'Costanti.WRITE_EXTERNAL_STORAGE' può essere qualsiasi int tu vuoi :) Ho sostituito dalla mia costante in un esempio definito dall'app:' statico finale int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 99; ' – CGR

+0

errore Gives : Impossibile risolvere il simbolo manifest. – Solo

Problemi correlati