Intereting Posts
Android: метод WebView goBack () показывает пустую страницу Ищете способ остановить форсирование моего приложения в полноэкранном режиме, когда показано добавление admob interstitial Невозможно разрешить атрибут из пространства имен android. Настройки мониторинга местоположения в библиотеке Как создать диалоговое окно предупреждения с помощью счетчика Проверьте, завершена ли анимация AnimatorSet? Parse JSON-объект со строкой и значением Что случилось с моей техникой мониторинга сенсора? Eclipse медленно наращивает ресурсы Android Как получить части содержимого Википедии в приложение для Android? Android, автономная версия traceview устарела Не удалось синхронизировать Gradle: не удалось найти версию Build Tools 24.0.0 rc1 GreenDAO поддерживает множественные отношения между таблицами Как я могу ударить точки останова (и увидеть номера строк ошибок) при отладке javascript на Android? Как получить позицию, выбранную в RecyclerView?

Создание каталога в / sdcard не удается

Я пытаюсь создать каталог в /sdcard программно, но он не работает. Приведенный ниже код всегда выводит directory not created.

 boolean success = (new File("/sdcard/map")).mkdir(); if (!success) { Log.i("directory not created", "directory not created"); } else { Log.i("directory created", "directory created"); } 

Solutions Collecting From Web of "Создание каталога в / sdcard не удается"

Здесь есть три вещи:

  1. Не предполагайте, что SD-карта смонтирована на /sdcard (может быть истинным в случае по умолчанию, но лучше не жестко кодировать). Вы можете получить местоположение SD-карты, запросив систему:

     Environment.getExternalStorageDirectory(); 
  2. Вы должны сообщить Android, что ваше приложение должно писать на внешнее хранилище, добавив запись разрешения использования в файл AndroidManifest.xml :

     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
  3. Если этот каталог уже существует, то mkdir вернет false. Поэтому проверьте наличие каталога и попробуйте создать его, если он не существует. В вашем компоненте используйте что-то вроде:

     File folder = new File(Environment.getExternalStorageDirectory() + "/map"); boolean success = true; if (!folder.exists()) { success = folder.mkdir(); } if (success) { // Do something on success } else { // Do something else on failure } 

У меня была такая же проблема после того, как я обновил свой Android-телефон до 6.0 (API-уровень 23). На меня работает следующее решение. Надеюсь, это поможет вам.

Проверьте версию Android. Если это> = 6.0 (уровень API 23), вам необходимо не только включить

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

В вашем AndroidManifest.xml, но также запросить разрешение перед вызовом mkdir () . Код snopshot.

 public static final int MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE = 1; public int mkFolder(String folderName){ // make a folder under Environment.DIRECTORY_DCIM String state = Environment.getExternalStorageState(); if (!Environment.MEDIA_MOUNTED.equals(state)){ Log.d("myAppName", "Error: external storage is unavailable"); return 0; } if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { Log.d("myAppName", "Error: external storage is read only."); return 0; } Log.d("myAppName", "External storage is not read only or unavailable"); if (ContextCompat.checkSelfPermission(this, // request permission when it is not granted. Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { Log.d("myAppName", "permission:WRITE_EXTERNAL_STORAGE: NOT granted!"); // Should we show an explanation? if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { // Show an expanation to the user *asynchronously* -- don't block // this thread waiting for the user's response! After the user // sees the explanation, try again to request the permission. } else { // No explanation needed, we can request the permission. ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE); // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an // app-defined int constant. The callback method gets the // result of the request. } } File folder = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM),folderName); int result = 0; if (folder.exists()) { Log.d("myAppName","folder exist:"+folder.toString()); result = 2; // folder exist }else{ try { if (folder.mkdir()) { Log.d("myAppName", "folder created:" + folder.toString()); result = 1; // folder created } else { Log.d("myAppName", "creat folder fails:" + folder.toString()); result = 0; // creat folder fails } }catch (Exception ecp){ ecp.printStackTrace(); } } return result; } @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE: { // If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // permission was granted, yay! Do the // contacts-related task you need to do. } else { // permission denied, boo! Disable the // functionality that depends on this permission. } return; } // other 'case' lines to check for other // permissions this app might request } } 

Дополнительную информацию см. В разделе « Запрос разрешений во время выполнения »

Правильный путь к SD-карте

 /mnt/sdcard/ 

Но, как уже было сказано, вы не должны жестко кодировать его. Если вы находитесь на Android 2.1 или после, используйте

 getExternalFilesDir(String type) 

В противном случае:

 Environment.getExternalStorageDirectory() 

Внимательно прочитайте https://developer.android.com/guide/topics/data/data-storage.html#filesExternal

Кроме того, вам нужно будет использовать этот метод или что-то подобное

 boolean mExternalStorageAvailable = false; boolean mExternalStorageWriteable = false; String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { // We can read and write the media mExternalStorageAvailable = mExternalStorageWriteable = true; } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { // We can only read the media mExternalStorageAvailable = true; mExternalStorageWriteable = false; } else { // Something else is wrong. It may be one of many other states, but all we need // to know is we can neither read nor write mExternalStorageAvailable = mExternalStorageWriteable = false; } 

Затем проверьте, можете ли вы получить доступ к SD-карте. Как сказано, прочитайте официальную документацию.

Другой вариант, возможно, вам нужно использовать mkdirs вместо mkdir

 file.mkdirs() 

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

Перезагрузите Android-устройство. Когда я перезапустил устройство, все стало работать на меня.

Если это происходит с Android 6 и компилирует target> = 23, не забывайте, что теперь мы используем разрешения во время выполнения . Так что предоставления разрешений в манифесте уже недостаточно.

Используйте mkdirs () вместо mkdir () .. это сработало для меня 🙂

 File folder = new File(Environment.getExternalStorageDirectory()+"/Saved CGPA"); if(!folder.exists()){ if(folder.mkdirs()) Toast.makeText(this, "New Folder Created", Toast.LENGTH_SHORT).show(); } File sdCardFile = new File(Environment.getExternalStorageDirectory()+"/Saved CGPA/cgpa.html"); 

В android api> = 23

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

вместо

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

У вас есть права на запись на SD-карту в манифест? Найдите WRITE_EXTERNAL_STORAGE на странице http://developer.android.com/reference/android/Manifest.permission.html.

Разве это уже не создано? Mkdir возвращает false, если папка уже существует слишком mkdir

Я допустил ошибку, включив оба: и

В указанном порядке. Поэтому, когда я вынул второе разрешение, (READ), проблема исчезла.

 File f = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/FoderName"); if (!f.exists()) { f.mkdirs(); }