Não é possível criar pasta no armazenamento externo no android

? benallansmith @ | Original: StackOverFlow
---

Meu telefone desenvolvimento é um Nexus 5, correndo Android 4.4.2 .

Na minha aplicação, eu estou tentando criar uma pasta no armazenamento externo que irá armazenar as informações de depuração para a minha candidatura . Basicamente, ele irá conter todos os comandos executados pelo aplicativo, de modo que quando um usuário encontra um problema, eu tenho a opção de tê-los me enviar as informações a partir da pasta de depuração para analisar.

Comecei por tentar gravar um arquivo para a pasta, mas descobriu que havia um erro ao criar a pasta. No começo eu estava usando mkdir(), depois me mudei para mkdirs(), que também não funcionou.

Eu tenho <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> no meu manifesto.

Aqui está o código para criar a pasta :

    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");
        } 

Aqui está o que eu também tentei:

    //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");
    }

Isso retorna que o armazenamento externo não está só ou não disponível ler.

Eu também tentei caminhos diferentes, como File folder = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "Folder1");

Este é o lugar onde se tornou muito confuso .

Tentei desenvolvimento em diferentes telefones. Em primeiro lugar, eu peguei uma Galaxy S4 GT-i9505 correr Android 4.2.2 e funcionou . Eu era capaz de criar as pastas e escrever para eles. Isso me mostrou que o código estava funcionando. Também o caminho retornado através da execução do código sobre o S4 e Nexus 5 foi o mesmo .

Então eu pensei que pode ser versão android específico. Então eu peguei uma Nexus 4 com Android 4.4.2 eo código trabalhou com ele também. Criado as pastas e permitiu-me a escrever para eles.

Nenhum dos telefones estão enraizadas e são todos padrão estoque. Não há aplicações especiais ou qualquer coisa que eu posso pensar de configurações sensato sobre o Nexus 5 que poderia causar problemas de permissões . A conexão é definida para o dispositivo de mídia (MTP) .

EDIT:

Devo acrescentar que eu tentei o acompanhamento que também não funcionou:

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

Estou confuso sobre o que está causando isso, há mais alguma coisa que eu possa testar ou mudar para corrigir o problema ?

Thanks.

---

Top 5 Responder

1Amadas @

Em primeiro lugar, new File ( ) é só criar o objeto para arquivo conectar. você quer usar esse arquivo, arquivo é existe ou CreateNewFile (). Se você quiser usar esse arquivo para criar o diretório, arquivo de verificação é existe, isDirectory depois então mkdir (). Em segundo lugar, verificar Environment.getExternalStorageDirectory é caminho variável. Você pode usar DDMS ou ADB para o trabalho. Adicionalmente, eu acho que você adicionar permissão para armazenamento externo para ler erro alguma coisa.

2Edward Falk @

Normalmente, eu faço isso :

/**
 * 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
}       

Além disso, adicionar essa permissão para o seu manifesto :

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

Se você quiser armazenagem privada (normalmente sob / data /) para o seu app (não no sdcard ), em seguida, olhar para getDir(), getFilesDir(), fileList(), openFileInput(), openFileOutput(), etc.

Há também funções de ajuda para obter diretórios privados dentro do sdcard para API 8 e acima : getExternalFilesDir(), getExternalCacheDir(), etc.

3benallansmith @

Acontece que o problema foi devido a, penso eu, a indexação.

Basicamente todos os outros dispositivos de I testado em, me permitiu restabelecer a ligação USB e visualizar os arquivos criados e pastas.

Por alguma razão o meu Nexus 5 não indexa as pastas / arquivos, mesmo que eles existam .

Eu baixei um terceiro aplicativo explorador de arquivos festa diferente e notei todas as pastas e arquivos estavam lá.

Então, para ver essas pastas e arquivos via depuração USB, eu tenho que reiniciar o telefone, a fim de re- indexá-los, o que parece muito chato, mas é melhor do que não funciona em todos .

4Liam George Betsworth @

Em termos de este ser um problema de indexação com o Nexus, isso funcionou para mim:

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);
            }
});

Você deve chamá-lo em linha reta depois de criar e salvar o arquivo. Ao utilizar o scanner, eu era capaz de ver arquivos e diretórios recém-criados simplesmente conectar novamente o dispositivo no .

De acordo com o http://developer.android.com/reference/android/media/MediaScannerConnection.html :

MediaScannerConnection fornece uma maneira para aplicações de passar um recém-   criado ou baixado arquivo de mídia para o serviço do scanner mídia. o   serviço de scanner de mídia vai ler metadados do arquivo e adicione o   arquivo para o provedor de conteúdo de mídia.

Espero que isso ajude alguém.