Не удается создать каталог в /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 ответов:
есть три вещи, чтобы рассмотреть здесь:
Не предполагайте, что sd-карта установлена в
/sdcard
(может быть актуально в случае по умолчанию, но лучше не жесткий код.). Вы можете получить местоположение sdcard, запросив систему:Environment.getExternalStorageDirectory();
вы должны сообщить Android, что ваше приложение должно писать на внешнее хранилище, добавив запись uses-permission в 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 }
у меня была такая же проблема после обновления моего телефона 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 } }
более подробная информация пожалуйста, прочтите "запрос разрешений на Время Выполнения"
перезагрузка ваш Android устройства. Вещи начали работать для меня после того, как я перезапустил устройство.
правильный путь к 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; }
затем проверьте, можете ли вы получить доступ к SD-карте. Как сказано, читайте официальная документация.
другой вариант, может быть, вам нужно использовать mkdirs вместо команды mkdir
file.mkdirs()
создает каталог, названный конечным именем этого файла, включая полный путь к каталогу, необходимый для создания этого каталога.
Если это происходит с вами с Android 6 и compile 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
есть много вещей, о которых вам нужно беспокоиться 1.Если вы используете Android Bellow Marshmallow, то вам нужно установить проницаемости в файле манифеста. 2. Если вы используете более позднюю версию Android означает от зефира до Орео сейчас Либо вам нужно перейти к информации о приложении и установить там вручную разрешение приложения для хранения. если вы хотите установить его во время выполнения, вы можете сделать это с ниже код
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; }
}