2015-10-23 13 views
13

Desidero leggere i file jpeg dalla sdcard sull'emulatore di Android 6.0, ma l'elenco dei file restituisce null. Il codice di esempio può funzionare sul mio telefono:listFiles() restituisce null sull'emulatore Android 6.0

  String sdcard = Environment.getExternalStorageDirectory().toString(); 
      File sdcard_dir = new File(sdcard); 
      if (sdcard_dir.isDirectory()) { 
       File[] fileNames = sdcard_dir.listFiles(new FileFilter() { 
        @Override 
        public boolean accept(File pathname) { 
         return pathname.toString().endsWith(".jpg") ? true : false; 
        } 
       }); 
      } 

fileNames = null!

posso usare adb shell per elencare i file di immagine sull'emulatore:

enter image description here

Il permesso è stato aggiunto alla AndroidManifest.xml:

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

C'è altro che posso fare?

Devo utilizzare l'emulatore perché il mio dispositivo non può essere aggiornato ad Android 6.0 finora e voglio testare alcune nuove API.

risposta

9

Android 6.0 ha introdotto le autorizzazioni di runtime. Oltre a dichiarare l'autorizzazione sul manifest, è necessario richiedere l'autorizzazione dell'utente in fase di runtime.

Maggiori informazioni e tutorial qui: http://developer.android.com/training/permissions/requesting.html

+0

Risolto! Grazie! – yushulx

+2

Ho lo stesso problema. Autorizzazione richiesta dall'utente in runtime.but non può risolvere il problema. – krishna

8

ho osservato esattamente lo stesso problema, anche dopo l'aggiunta del codice di permessi di esecuzione richiesto con Android 6.0.

Nella mia attività ho il seguente codice:

int permissionCheck1 = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE); 
    int permissionCheck2 = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE); 
    if (permissionCheck1 != PackageManager.PERMISSION_GRANTED || permissionCheck2 != PackageManager.PERMISSION_GRANTED) { 
     ActivityCompat.requestPermissions(this, 
       new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, 
          Manifest.permission.READ_EXTERNAL_STORAGE}, 
       REQUEST_READWRITE_STORAGE); 
    } 

e ricevo la richiamata previsto quando l'utente conferma la richiesta per i permessi di lettura/scrittura di stoccaggio.

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

Ho verificato nel debugger che sono state concesse entrambe le autorizzazioni di lettura e scrittura. Eppure la chiamata successivamente eseguita a leggere stoccaggio fallisce:

File[] possible_files = mrpDir.listFiles(); 

La chiamata a ListFiles() restituisce null. Se interrompo l'applicazione e vado in Impostazioni> App per la mia app, vedo che è stata concessa l'autorizzazione di archiviazione. Se termino anche l'app e la riavvii, le autorizzazioni sono lì, come previsto, e le chiamate listFiles() funzionano correttamente. In altre parole, la modifica delle autorizzazioni non ha effetto fino a quando l'app non viene terminata e riavviata. C'è un modo per far sì che l'app riconosca le autorizzazioni modificate senza dover interrompere l'utente e riavviarlo manualmente?

Come con il mittente di questo thread, sono in esecuzione con un emulatore API 23, poiché attualmente non ho accesso a un dispositivo Android 6. Quindi suppongo sia possibile che ci sia un problema con l'emulatore. Ma sembra improbabile.

1

La prima chiamata

if (permissionCheck1 != PackageManager.PERMISSION_GRANTED || permissionCheck2 != PackageManager.PERMISSION_GRANTED) { 
    ActivityCompat.requestPermissions(this, 
      new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, 
         Manifest.permission.READ_EXTERNAL_STORAGE}, 
      REQUEST_READWRITE_STORAGE); 
} 

è quello di verificare se si ha il permesso. Se non lo hai, il permesso è richiamato. Questa è la prima volta.

Successivamente, il callback non viene chiamato poiché si dispone già dell'autorizzazione.Quindi il tuo codice dovrebbe apparire come

if (permissionCheck1 != PackageManager.PERMISSION_GRANTED || permissionCheck2 != PackageManager.PERMISSION_GRANTED) { 
    ActivityCompat.requestPermissions(this, 
      new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, 
         Manifest.permission.READ_EXTERNAL_STORAGE}, 
      REQUEST_READWRITE_STORAGE); 
} 
else 
    finishCreationStep(); 
Problemi correlati