Создание каталога в /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");
}
Ответы
Ответ 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"/>
Ответ 8
У вас есть права на запись на SD-карту в манифест?
Найдите WRITE_EXTERNAL_STORAGE в http://developer.android.com/reference/android/Manifest.permission.html
Ответ 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();
}