Создание каталога в / 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");
}

Ответы на вопрос(12)

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

о которых вам нужно беспокоиться 1. Если вы используете Android Bellow Marshmallow, вам нужно установить проницаемость в файле манифеста. 2. Если вы используете более позднюю версию Android, значит, от Marshmallow до Oreo сейчас. Либо вам нужно перейти к информации о приложении и установить там вручную разрешение приложения для хранилища. если вы хотите установить его во время выполнения, вы можете сделать это с помощью кода ниже

public  boolean isStoragePermissionGranted() {
if (Build.VERSION.SDK_INT >= 23) {
    if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
            == PackageManager.PERMISSION_GRANTED) {
        Log.v(TAG,"Permission is granted");
        return true;
    } else {

        Log.v(TAG,"Permission is revoked");
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
        return false;
    }
}
else { //permission is automatically granted on sdk<23 upon installation
    Log.v(TAG,"Permission is granted");
    return true;
}

}

Правильный путь к SDCard

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

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

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

file.mkdirs()

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

 Maragues04 окт. 2010 г., 13:07
Спасибо, исправлено. Я быстро просмотрел раздел хранилища данных и предположил, что к нему обращались так же, как и к getExternalStorageDirectory (), которым я и пользуюсь.
 M Hassen14 февр. 2013 г., 12:10
file.mkdirs () работал для меня. с "s" не mkdir ()
 Amit Thaper13 февр. 2014 г., 14:20
Как уже упоминалось, я проверил состояние. состояние показывает, что я смонтирован, но я не могу создать папку
 CommonsWare04 окт. 2010 г., 13:00
Здесь нетgetExternalFilesDir() наEnvironment в любой версии Android. Вы можете думать оgetExternalFilesDir() наContext, который был добавлен в 2.2. Тем не менее, этот метод несколько сломан - его каталог будет удален во время обновления приложения. Я надеюсь, что это будет исправлено в Gingerbread.
 sajjoo04 окт. 2010 г., 10:43
да, я добавил эту строку в файл манифеста в теге приложения, но он не создает каталог.
 d.aemon12 окт. 2016 г., 14:04
Бишой - Это не совсем так. Вы должны запрашивать разрешение во время выполнения, только когда вы нацеливаетесь на API 23 и выше. Если вы ориентируетесь на более низкий SDK, вам не нужно запрашивать разрешение во время выполнения даже при работе в SDK 23+
 Bishoy Fakhry27 июн. 2016 г., 12:02
Если вы запускаете приложение с помощью API 23, сначала вы должны запросить разрешение у пользователяdeveloper.android.com/training/permissions/requesting.html

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

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

а также:

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

в вышеуказанном порядке. Поэтому, когда я вынул второе разрешение, (ЧИТАЙТЕ), проблема ушла.

 user263834531 янв. 2014 г., 16:22
Я включил как разрешения WRITE_EXTERNAL_STORAGE, так и разрешения READ_EXTERNAL_STORAGE. Вам нужен только первый.

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

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

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

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

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

Больше информации читайте "Запрос разрешений во время выполнения"

 robinst27 нояб. 2018 г., 09:05
Так по сутиdeveloper.android.com/training/data-storage/files не обновлен, он не упоминает разрешения времени выполнения: /.
 Amber16 дек. 2016 г., 00:52
В заключение!! Я весь день искал эту информацию, пытаясь выяснить, почему я получаю это сообщение «fail readDirectory () errno = 13» после указания разрешений в моем манифесте. Спасибо!!
 Diiiiii05 дек. 2016 г., 12:37
@BalajiSrinivasan, нет! только для так называемых «Опасных разрешений». Проверьте ссылку внизу моего ответа, чтобы увидеть, кто они.
 Shadoninja09 апр. 2017 г., 05:22
Я довольно дремучий, так что этого поста мне не хватило. Вот видео, которое я в конце концов нашел, которое демонстрирует, как действительно четко запрашивать разрешения -youtube.com/watch?v=C8lUdPVSzDk
 Diiiiii07 июл. 2017 г., 14:48
Эй, Pillesoft, какой у тебя уровень API? Вы видели всплывающее окно с запросом разрешения на запись с Android после использования кода выше? Если вы видите их, вы должны нажать «да». Таким образом, вы получаете разрешение на запись, затем вызываете mkdir (). В противном случае могут быть некоторые ошибки в вашей реализации. GL
 d.aemon12 окт. 2016 г., 13:53
Запрос разрешения во время выполнения необходим только тогда, когда вы ориентируетесь на SDK 23 и выше. Когда приложение предназначено для более низких SDK, запросы времени выполнения не требуются, и ContextCompat.checkSelfPermission всегда будет возвращать true в этом конкретном случае.
 Balaji Srinivasan28 нояб. 2016 г., 18:24
Спасибо! Все ли разрешения должны быть предоставлены таким образом? Или это требуется только для разрешений, связанных с хранением?
 pillesoft06 июл. 2017 г., 14:02
Привет, этот пост помог мне не иметь исключений, а также папки, файлы для создания. НО я до сих пор не вижу свою папку и файлы внутри. Я хочу создать новую папку в папке «Документы» и сохранить свои файлы там. Любая идея? устройство перезагружено ...
Решение Вопроса

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

Environment.getExternalStorageDirectory();

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

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

Если этот каталог уже существует, то 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 
}
 Tomáš Zato12 февр. 2016 г., 12:57
Где именно в XML-файле я должен разместить блок-разрешения-использования?
 Kamran Bigdely14 окт. 2016 г., 19:16
У меня была похожая проблема, и я обнаружил, что если мой телефон подключен к компьютеру через USB, он не может создать каталог. Когда я отключил телефон и снова запустил приложение, оно правильно создало папку и файлы.
 Arthur Thompson29 июл. 2016 г., 22:54
Это должен быть элемент приложения в AndroidManifest.
 Siddharth27 июл. 2013 г., 06:22
Это также работает для меня, чтобы записать некоторые данные в SDCard.
 Aubin01 авг. 2013 г., 21:23
+1 за использование-разрешение
 JPM02 сент. 2011 г., 00:24
По какой-то причине этот код не работает для меня на моем телефоне myTouch ... хм .mkdir () всегда возвращает false.
 Gopinath05 сент. 2011 г., 14:06
Я думаю, что вы должны проверить разрешение и что диск не смонтирован в файловой системе ПК.
 Gopinath04 окт. 2010 г., 13:00
До Froyo SD-карта была установлена ​​в / SDCard. Начиная с Froyo, sd-карта монтируется в / mnt / sdcard, и создается мягкая ссылка на / sdcard, чтобы приложения продолжали работать должным образом, несмотря на изменение точки монтирования.
 Daniel Magnusson15 мая 2012 г., 16:36
Су ... если все это не удастся? ; (

)

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. У меня все заработало после перезагрузки устройства.

 Rat-a-tat-a-tat Ratatouille06 июн. 2014 г., 09:16
+1, это сработало для устройства, на котором я работал. но просто любопытно, почему это происходит ??
 shehzy08 июл. 2015 г., 08:53
Используйте mediaScan или sendbroadcast для Media_mount, чтобы обновить хранилище мультимедиа новыми каталогамиstackoverflow.com/questions/3300137/...
 Uriel Frankel19 февр. 2015 г., 14:26
Я думаю, что я отладил свое приложение, и одна из блокировок записи была заблокирована, и никогда не выпускалась.

= 23

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

вместо

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

если папка уже существуетMkDir

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

Ваш ответ на вопрос