2010-10-31 7 views
17

Quando si avvia la mia applicazione Android, ho bisogno di creare una directory sulla scheda SD, per un piccolo numero di utenti questo non riesce e non riesco a capire il motivo per esso ...mkdirs restituisce false per la directory su sd card mentre la directory superiore è scrivibile

(ho trovato problemi simili causati da permesso WRITE_EXTERNAL_STORAGE mancante, è lì e funziona per quasi tutti gli utenti in modo da non penso che questo sia motivo)

ho semplificata la situazione precedente per semplificare la spiegazione, se la creazione di una directory fallisce, eseguo un test case in cui provo a creare una directory .test sulla sdcard:

new File(Environment.getExternalStorageDirectory(), ".test").mkdir() -> false 
new File(Environment.getExternalStorageDirectory(), ".test").mkdirs() -> false 

proprietà dei file delle directory rilevanti:

/sdcard/.test (esiste = false CanWrite = false CanRead = false CanExecute = err isDirectory = false isFile = false)

/sdcard (esiste = true CanWrite = true CanRead = true CanExecute = err isDirectory = true isFile = false)

/(esiste = true CanWrite = false CanRead = true CanExecute = err isDirectory = true isFile = false)

getExternalStorageState = montato

(rendimenti CanExecute sbagliano perché il test viene eseguito su sdk < 9)

suggerimenti e le idee sono i benvenuti ...

+1

Puoi mostrare il codice dove stai cercando di creare la directory? Ad esempio, se hai '/ sdcard' cablato, potrebbe esserci il tuo problema. – CommonsWare

+0

@CommonsWare: sto usando Environment.getExternalStorageDirectory() e sto pensando di passare a Context.getExternalFilesDir (null) una volta che ho risolto questo problema ... modifico il mio post originale con il codice .. Grazie per la risposta veloce ! – Danny

+0

Ricorda che 'getExternalFilesDir()' esiste solo per Android 2.2 ed è rotto in quella versione. Mi attenerei alla tua strategia attuale per il prossimo futuro. – CommonsWare

risposta

15

E 'comune quando non si dispone di un permesso nel tuo manifest.

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

Per quanto mi riguarda, era l'unica cosa sbagliata.

+5

Ho solo questo problema per un numero molto piccolo di utenti e il mio AndroidManifest.xml ha il permesso WRITE_EXTERNAL_STORAGE all'interno del tag manifest quindi mi dispiace dire che questo non è il motivo .. – Danny

2

È possibile che questi utenti dispongano di una scheda SD corrotta e quindi montata in sola lettura. Se possibile, dovresti controllare con loro per vedere se qualcos'altro può scrivere file su di esso. Dato che hai l'autorizzazione WRITE_EXTERNAL_STORAGE, non dovresti avere problemi a modificare la scheda SD (e le autorizzazioni di tutto nella scheda SD sono di tipo lettura/scrittura mondiale per tali app, quindi niente può compromettere i permessi dei file per causare loro problemi).

+0

Non penso che sia così, Io uso http://developer.android.com/reference/android/os/Environment.html#getExternalStorageState() per verificare questo e dà "montato", dovrebbe dare "montato_ro" nella tua situazione penso ... Grazie però .. – Danny

0

ho sperimentato un problema simile quando si utilizza mkdirs(), tuttavia, perché l'esecuzione del comando:

mkdir uno/due

fallisce su Linux, quindi l'API (http://download.oracle.com/javase/1.4.2/docs/api/java/io/File.html#mkdirs()) in seguito non troppo . Immagino che questo significhi che non c'è modo di usare mkdirs su Android? La mia (probabilmente piuttosto hacky) work-around è stato quello di creare ogni directory necessaria a parte:

String extStorageDirectory = Environment.getExternalStorageDirectory().toString(); 
new File(extStorageDirectory + "/one/").mkdirs(); 
new File(extStorageDirectory + "/one/two/).mkdirs(); 
4

ho avuto problemi cercando di creare directory sul SDCard pure. Ho trovato che cosa stava succedendo è che il mio codice avrebbe funzionato bene su alcuni telefoni, e anche l'emulatore. Tuttavia altri telefoni segnalerebbero errori.

Credo che ci sia un problema con alcuni telefoni, l'Atrix e il Bionic sono due esempi.

Questi telefoni quando si utilizza il codice Environment.getExternalStorageDirectory() restituiscono effettivamente/mnt/sdcard.

Tuttavia su questi telefoni la scheda SD è in realtà/mnt/sdcard-ext.

Quindi da qualche parte lungo le linee sembra che alcuni produttori abbiano infranto il codice getExternalStorageDirectory e in qualche modo restituisca una posizione errata.

Ho avuto un po 'di tempo a capire questo perché il mio codice ha funzionato su molti dispositivi diversi, e ancora alcuni utenti hanno segnalato di aver fallito.

3

Ho avuto lo stesso problema. Il permesso è stato impostato e anche il percorso era quello predefinito (/ mnt/sdcard) ma il mio androide è stato montato come dispositivo di archiviazione esterno per la navigazione rapida della scheda SD. Tuttavia questo interferisce con altre app.

ho capito questo durante le immersioni nella shell adb:

$ cd /mnt 
$ cd sdcard 
cd: can't cd to sdcard 
$ ls -l 
d--------- system system   2011-12-07 01:59 sdcard 

dello smontare l'immagine che ho:

$ ls -l     
drwxrwxr-x system sdcard_rw   2011-12-07 11:46 sdcard 

Come si può vedere mentre montato lo sdcard è nel sistema gruppo di utenti e non ci sono permessi. Dopo lo smontaggio, il gruppo viene modificato in sdcard_rw e le autorizzazioni di lettura e scrittura sono concesse.

2

So che questo è un vecchio post ma ho pensato di poter ancora offrire un suggerimento. Se stai eseguendo la tua app durante lo sviluppo (ovvero il telefono è collegato al PC tramite USB), è probabile che la scheda SD sia stata montata dal PC. Devi smontarlo (puoi farlo dal telefono o dal PC) per ottenere il permesso di scrittura, questo richiede che sia stato impostato nel manifest.

2

Ho pensato che stavo avendo questo problema durante il debug di un'app. Stava fallendo perché la scheda SD è stata montata dal computer host durante il debug. Smontando dal computer, l'app ha funzionato di nuovo.

+0

Forse mi sbaglio ma è tecnicamente la stessa risposta della mia solo con meno parole ...: | – yoshi

4

Il mio problema era che stavo usando mkdir per creare un percorso di directory multiple e ho ottenuto false ogni volta. Una volta ho usato il mkdirs il mio problema è stato risolto

1

Mi sono imbattuto in questo problema quando il link simbolico/memoria/emulato/0 era in qualche modo mancante. Quello che ho fatto è stato usare l'app per fotocamera per scattare una foto. Ho osservato che i dettagli delle immagini dicevano che era all'interno/storage/emulato/0, sebbene quella directory non esistesse dal file explorer. Quindi ho riavviato il telefono. Dopo il riavvio, la directory è comparsa in Esplora file.

0

Mi sono imbattuto in questo problema sul dispositivo virtuale. Per me il problema era che non avevo definito alcuna memoria esterna per il dispositivo virtuale. Si spera che aiuti qualcuno.

6

Ho avuto un problema simillar e ho impiegato diverse ore per capire cosa c'è che non va. Non ha funzionato su Sumsung Mega, ma per altri telefoni ha funzionato bene. Avevo davvero il permesso WRITE_EXTERNAL_STORAGE e getExternalStorageDirectory è montato e disponibile. Ma ancora la directory non è stata creata. Cosa ha aiutato? Ho appena riavviato il divice! E ha aiutato! È un peccato che nessuno l'abbia già avvertito prima. Spero che questo ti aiuti!

7

Prima di tutto, tecnicamente mkdirs() restituendo false non significa che non sia riuscito, significa solo che non ha creato le directory. Se le directory esistono già, mkdirs() continuerà a restituire false.

In secondo luogo, in Android 6, solo è necessario:

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

È anche bisogno di qualche equivalente di:

ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED 

Per ulteriori informazioni sulla verifica delle autorizzazioni, vedi:
https://github.com/googlesamples/android-RuntimePermissions

+0

E cosa fare se il permesso non viene concesso? Come richiederlo correttamente? –