Impossibile creare cartella di archiviazione esterna su android

? benallansmith @ | Original: StackOverFlow
---

Il mio telefono è lo sviluppo di un Nexus 5, in esecuzione Android 4.4.2 .

Nella mia domanda, io sto cercando di creare una cartella su memoria esterna che memorizzerà le informazioni di debug per la mia applicazione . Fondamentalmente conterrà tutti i comandi eseguiti dall'applicazione, in modo che quando un utente incontra un problema, ho la possibilità di avere loro mi inviano le informazioni dalla cartella di debug da analizzare.

Ho iniziato cercando di scrivere un file nella cartella, ma ho trovato c'era un errore nella creazione della cartella. In un primo momento stavo usando mkdir(), poi mi sono spostato su mkdirs(), che, inoltre, non ha funzionato .

Ho <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> nel mio manifesto.

Ecco il codice per creare la cartella :

    File folder = new File(Environment.getExternalStorageDirectory() + "/DebugData");

    String path = folder.getPath();

    if(!folder.mkdirs() || !folder.exists()){        
            Log.e(LOG_TAG, path + " failed");
        } else {
            Log.d(LOG_TAG, path + " succeeded");
        } 

Ecco quello che ho anche provato :

    //Check SD card state
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state) || !Environment.MEDIA_MOUNTED.equals(state)) {
        Log.e(LOG_TAG, "Error: external storage is read only or unavailable");
    } else {
        Log.d(LOG_TAG, "External storage is not read only or unavailable");
    }

Ciò restituisce che la memorizzazione esterna non è di sola lettura o non disponibile .

Ho anche provato percorsi diversi, come ad esempio File folder = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "Folder1");

Questo è dove è diventato davvero confusa .

Ho provato lo sviluppo su diversi telefoni . In primo luogo, ho preso una Galaxy S4 GT-i9505 correre Android 4.2.2 e ha funzionato . Sono stato in grado di creare le cartelle e scrivere per loro . Questo mi ha mostrato che il codice funzionava . Anche il percorso restituito eseguendo il codice a S4 e Nexus 5 era lo stesso .

Poi ho pensato che potrebbe essere la versione di Android specifica . Così ho preso una Nexus 4 con Android 4.4.2 e il codice ha lavorato su di esso pure . Creata le cartelle e mi ha permesso di scrivere per loro .

Nessuno dei telefoni sono radicate e sono tutti madre standard . Non c'è applicazioni speciali o qualsiasi cosa che posso pensare di impostazioni saggi sul Nexus 5 che potrebbe causare problemi di autorizzazioni . Il collegamento è impostato su dispositivo multimediale ( MTP ) .

EDIT:

Vorrei aggiungere che ho provato il seguito che, inoltre, non ha funzionato :

Writing a file to the root directory of the external storage Creating the file in the external storage root directory and writing to it Creating a folder in a path outlined and writing a file to it Creating the file in the path outlined and writing to it

Sono confuso su ciò che sta causando questo, c'è qualcos'altro che posso provare o modificare per risolvere il problema ?

Thanks.

---

Top 5 Risposta

1Amadas @

In primo luogo, nuovo File ( ) è solo creare l'oggetto per il file connect . si desidera utilizzare questo file, file esiste o CreateNewFile ( ) . Se si desidera utilizzare questo file per creare directory, file di controllo è esiste, isDirectory dopo allora mkdir ( ) . In secondo luogo, verificare Environment.getExternalStorageDirectory è percorso variabile. È possibile utilizzare DDMS o ADB per il lavoro . Additionaly, penso che si aggiunge l'autorizzazione per l'archiviazione esterna lettura per errore qualcosa .

2Edward Falk @

In genere, faccio questo :

/**
 * Return a dedicated directory named "MyApp" at the top of external storage
 */
public static file getDataDir() {
    File sdcard = Environment.getExternalStorageDirectory();
    if( sdcard == null || !sdcard.isDirectory() ) {
        // TODO: warning popup
        Log.w(TAG, "Storage card not found " + sdcard);
        return null;
    }
    File dataDir = new File(sdcard, "MyApp");
    if( !confirmDir(dataDir) ) {
        // TODO: warning popup
        Log.e(TAG, "Unable to create " + dataDir);
        return null;
    }
    return dataDir;
}   

private static boolean confirmDir(File dir) {
    if (dir.isDirectory()) return true;  // already exists
    if (dir.exists()) return false;      // already exists, but is not a directory
    return dir.mkdirs();                 // create it
}       

Inoltre, aggiungere questa autorizzazione al manifesto :

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

Se volete ammasso privato ( in genere sotto / dati / ) per la vostra applicazione ( non su sdcard ), quindi cercare in getDir(), getFilesDir(), fileList(), openFileInput(), openFileOutput(), etc.

Ci sono anche funzioni di supporto per ottenere directory private all'interno della sdcard per API 8 e sopra : getExternalFilesDir(), getExternalCacheDir(), etc.

3benallansmith @

Abbiamo scoperto che il problema era dovuto, credo, l'indicizzazione .

Fondamentalmente tutti gli altri dispositivi che ho testato su, mi ha permesso di ristabilire la connessione USB e visualizzare i file e le cartelle create .

Per qualche motivo il mio Nexus 5 non indicizza il cartelle / file, anche se esistono .

Ho scaricato una diversa applicazione File Explorer 3rd party e ho notato tutte le cartelle ei file erano lì .

Quindi, per visualizzare cartelle e file tramite il debug USB, devo riavviare il telefono al fine di ri -index di loro, che sembra abbastanza fastidioso, ma è meglio di quello che non funziona affatto .

4Liam George Betsworth @

In termini di questo essere un problema di indicizzazione con il Nexus, questo ha funzionato per me :

MediaScannerConnection.scanFile(this, new String[] { file.toString() }, null,
        new MediaScannerConnection.OnScanCompletedListener() {
            public void onScanCompleted(String path, Uri uri) {
                Log.i("ExternalStorage", "Scanned " + path + ":");
                Log.i("ExternalStorage", "-> uri=" + uri);
            }
});

Si dovrebbe chiamare subito dopo aver creato e salvato il file . Utilizzando lo scanner, sono stato in grado di vedere i file appena creati e directory semplicemente ricollegando il dispositivo in .

Secondo la http://developer.android.com/reference/android/media/MediaScannerConnection.html :

MediaScannerConnection fornisce un modo per le applicazioni di passare una nuova   creato o scaricato file multimediale al servizio dello scanner media. il   servizio scanner supporti leggerà i metadati dal file e aggiungere il   file per il fornitore di contenuti multimediali .

Spero che questo aiuti qualcun altro .