Невозможно создать папку на внешнем хранилище на Android

? benallansmith @ | Original: StackOverFlow
---

Мой телефон развитиеNexus 5, работает Android 4.4.2 .

В моем приложении, я пытаюсь создать папку на внешнем хранилище, где будет храниться отладочную информацию для моего приложения . В основном он будет содержать все команды, выполняемые приложением, так что, когдапользователь сталкивается с проблемой, у меня есть возможность иметь их отправить мне информацию из папки отладки для анализа .

Я начал с пытаюсь написать файл в папку, но нашел тамошибка при создании папки. Сначала я использовал mkdir(), затем перешел на mkdirs(), который также не работает.

У меня есть <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> в моем манифесте.

Воткод для создания папки :

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

Вот то, что я также пытался :

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

Это возвращает, чтовнешнее запоминающее не только для чтения или нет.

Я также пробовал разные пути, такие как File folder = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "Folder1");

Это где он стал очень запутанной .

Я пытался разработку на различных телефонах. Во-первых, я схватилGalaxy S4 GT-i9505 работает Android 4.2.2, и она работала . Я был в состоянии создать папки и записи в них. Это показало мне, чтокод работает. ТакжеПуть, который, выполнив код на S4 и Nexus 5 былтакой же.

Тогда я думал, что это может быть Android от версии . Так что я схватилNexus 4 с Android 4.4.2 икод работал на нем, как хорошо. Создал папки и позволил мне написать для них.

Ни один из телефонов не коренятся и все акции стандарт . Там нет никаких специальных приложений или все, что я могу думать о настройках мудрый на Nexus 5, которые могут вызвать разрешений проблем. Соединение устанавливается на носителе информации ( MTP ).

EDIT:

Я должен добавить, что я пытался последующей который также не работает:

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

Я смущен относительно того, что является причиной этого, есть что-нибудь еще я могу проверить или изменить, чтобы исправить проблему?

Thanks.

---

Top 5 ответ

1Amadas @

Во-первых, новый файл () просто создать объект для файла подключения . Вы хотите использовать этот файл, файл существует или createNewFile (). Если вы хотите использовать этот файл для создания каталога, проверка файла существует, isDirectory после затем MKDIR (). Во-вторых, проверить Environment.getExternalStorageDirectory является переменной пути . Вы можете использовать DDMS или АБР для работы. Дополнительно, я думаю, что вы добавить разрешение на чтение внешнего хранения чего-то ошибки.

2Edward Falk @

Как правило, я делаю это :

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

Кроме того, добавьте это разрешение ваш манифест :

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

Если вы хотите личное хранения (обычно в / данные / ) для вашего приложения (не на SDCard ), а затем посмотреть на getDir(), getFilesDir(), fileList(), openFileInput(), openFileOutput() и т.д.

Есть также вспомогательные функции для получения личные каталоги внутри SDCard для API 8 и выше: getExternalFilesDir(), getExternalCacheDir() и т.д.

3benallansmith @

Оказываетсяпроблема была из-за, как мне кажется, индексацию.

В основном все другие устройства я проверил на, позволило мне восстановить соединение USB и просматривать созданные файлы и папки.

По какой-то причине мой Nexus 5 не индексирует папки / файлы, даже если они существуют.

Я скачал другую третьего Application Explorer партия файла и заметил, что все папки и файлы были там.

Таким образом, чтобы просмотреть эти папки и файлы с помощью отладки USB, я должен перезагрузить телефон для того, чтобы повторно индексировать их, что, кажется, очень раздражает, но это лучше, чем не работать вообще.

4Liam George Betsworth @

С этой точки зрения являетсявопрос индексации с Nexus, это работает для меня :

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

Вы должны назвать его сразу после создания и сохранения файла. С помощью сканера, я смог увидеть созданные файлы и каталоги, просто снова подключить устройство в .

Согласно http://developer.android.com/reference/android/media/MediaScannerConnection.html :

MediaScannerConnection предоставляет возможность для приложения, чтобы пройтивновь   Созданный или загруженный медиа- файл на сервис СМИ сканера.   медиа-служба Сканер будет считывать метаданные из файла и добавить   подать к поставщику контента СМИ .

Надеюсь, что это помогает кто-то еще.