Подтвердить что ты не робот

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

Ответ 1

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

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

    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 
    }
    

Ответ 2

У меня была такая же проблема после того, как я обновил свой 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 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
    }
}

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

Ответ 3

Правильный путь к 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()

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

Ответ 4

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

Ответ 5

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

Ответ 6

используйте 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");

Ответ 7

в android api >= 23

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

вместо

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

Ответ 9

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

Ответ 10

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

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

и

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

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

Ответ 11

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