Intereting Posts
Тесты завершаются после обновления Espresso 2 (не удалось: сбой инструментария из-за «java.lang.IllegalAccessError») Android Studio: «новый модуль -> импортировать существующий проект» и «модуль импорта» Android Iframe SameOrigin на пользовательских сайтах Android multidex, UnsatisfiedLinkError – не удалось найти файл .so Добавить новый контакт с помощью нескольких телефонных номеров Служба Android продолжает жить Обрезать изображение, передав путь к файлу изображения в Android Получить размер файла в android sdk? ActionDone imeOption не работает на EditText в Android 2.3 Как урезать TextView, а затем добавить эллипсис в Android Есть ли способ подключиться к устройству Bluetooth Low Energy под Android 5, отображая публичный статический адрес? Как убить приложение со всеми его действиями? AuthToken из AccountManager в Android Client больше не работает Как отключить все события щелчка макета? Когда я должен снова заблокировать камеру?

Как автоматически создать каталог на SD-карте

Я пытаюсь сохранить файл в следующем месте
FileOutputStream fos = new FileOutputStream("/sdcard/Wallpaper/"+fileName); Но я получаю исключение java.io.FileNotFoundException
Однако, когда я помещаю путь как "/sdcard/" он работает.

Теперь я предполагаю, что я не могу автоматически создать каталог таким образом.

Может ли кто-нибудь предложить, как создать directory and sub-directory с помощью кода?

Solutions Collecting From Web of "Как автоматически создать каталог на SD-карте"

Если вы создаете объект File, который обертывает каталог верхнего уровня, вы можете назвать его методом mkdirs () для создания всех необходимых каталогов. Что-то вроде:

 // create a File object for the parent directory File wallpaperDirectory = new File("/sdcard/Wallpaper/"); // have the object build the directory structure, if needed. wallpaperDirectory.mkdirs(); // create a File object for the output file File outputFile = new File(wallpaperDirectory, filename); // now attach the OutputStream to the file object, instead of a String representation FileOutputStream fos = new FileOutputStream(outputFile); 

Примечание. Было бы разумно использовать Environment.getExternalStorageDirectory () для получения каталога «SD Card», поскольку это может измениться, если приходит телефон, у которого есть что-то другое, кроме SD-карты (например, встроенная вспышка, a'la iPhone). В любом случае вы должны иметь в виду, что вам нужно проверить, чтобы убедиться, что он на самом деле там, поскольку SD-карта может быть удалена.

ОБНОВЛЕНИЕ: поскольку API-уровень 4 (1.6) вам также потребуется запросить разрешение. Что-то вроде этого (в манифесте) должно работать:

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

Имел ту же проблему и просто хочу добавить, что AndroidManifest.xml также нуждается в этом разрешении:

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

Вот что работает для меня.

  uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" 

В вашем манифесте и приведенном ниже коде

 public static boolean createDirIfNotExists(String path) { boolean ret = true; File file = new File(Environment.getExternalStorageDirectory(), path); if (!file.exists()) { if (!file.mkdirs()) { Log.e("TravellerLog :: ", "Problem creating Image folder"); ret = false; } } return ret; } 

Фактически я использовал часть @fiXedd asnwer, и это сработало для меня:

  //Create Folder File folder = new File(Environment.getExternalStorageDirectory().toString()+"/Aqeel/Images"); folder.mkdirs(); //Save the path as a string value String extStorageDirectory = folder.toString(); //Create New file and name it Image2.PNG File file = new File(extStorageDirectory, "Image2.PNG"); 

Убедитесь, что вы используете mkdirs (), а не mkdir (), чтобы создать полный путь

С API 8 и выше местоположение SD-карты изменилось. @ Ответ fiXedd хорош, но для безопасного кода вы должны использовать Environment.getExternalStorageState() чтобы проверить, доступен ли носитель. Затем вы можете использовать getExternalFilesDir() для перехода к getExternalFilesDir() директории (при условии, что вы используете API 8 или выше).

Вы можете прочитать больше в документации SDK .

Убедитесь, что имеется внешнее хранилище: http://developer.android.com/guide/topics/data/data-storage.html#filesExternal

 private boolean isExternalStoragePresent() { 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; } if (!((mExternalStorageAvailable) && (mExternalStorageWriteable))) { Toast.makeText(context, "SD card not present", Toast.LENGTH_LONG) .show(); } return (mExternalStorageAvailable) && (mExternalStorageWriteable); } 

Я столкнулся с той же проблемой. В Android есть два типа разрешений:

  • Опасно (доступ к контактам, запись на внешнее хранилище …)
  • Нормальный (обычные разрешения автоматически утверждаются Android, а опасные разрешения должны быть одобрены пользователями Android.)

Вот стратегия получения опасных разрешений в Android 6.0

  • Проверьте, есть ли у вас разрешение
  • Если вашему приложению уже предоставлено разрешение, действуйте нормально.
  • Если ваше приложение еще не имеет разрешения, попросите пользователя одобрить
  • Прослушать утверждение пользователя в onRequestPermissionsResult

Вот мой случай: мне нужно написать внешнее хранилище.

Во-первых, я проверяю, есть ли у меня разрешение:

 ... private static final int REQUEST_WRITE_STORAGE = 112; ... boolean hasPermission = (ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED); if (!hasPermission) { ActivityCompat.requestPermissions(parentActivity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_WRITE_STORAGE); } 

Затем проверьте одобрение пользователя:

 @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { case REQUEST_WRITE_STORAGE: { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { //reload my activity with permission granted or use the features what required the permission } else { Toast.makeText(parentActivity, "The app was not allowed to write to your storage. Hence, it cannot function properly. Please consider granting it this permission", Toast.LENGTH_LONG).show(); } } } } 

Я столкнулся с такой же проблемой, не смог создать каталог на Galaxy S, но смог создать ее на Nexus и Samsung Droid. Как я исправил это, добавив следующую строку кода:

 File dir = new File(Environment.getExternalStorageDirectory().getPath()+"/"+getPackageName()+"/"); dir.mkdirs(); 

Не забудьте убедиться, что у вас нет специальных символов в именах файлов / папок. Случилось со мной: «Когда я устанавливал имена папок с помощью переменных (переменных)

Не допускаются символы в именах файлов / папок

"* /: <>? \ |

U может найти этот код полезным в таком случае.

Следующий код удаляет все «:» и заменяет их «-»,

 //actualFileName = "qwerty:asdfg:zxcvb" say... String[] tempFileNames; String tempFileName =""; String delimiter = ":"; tempFileNames = actualFileName.split(delimiter); tempFileName = tempFileNames[0]; for (int j = 1; j < tempFileNames.length; j++){ tempFileName = tempFileName+" - "+tempFileNames[j]; } File file = new File(Environment.getExternalStorageDirectory(), "/MyApp/"+ tempFileName+ "/"); if (!file.exists()) { if (!file.mkdirs()) { Log.e("TravellerLog :: ", "Problem creating Image folder"); } } 
 File sdcard = Environment.getExternalStorageDirectory(); File f=new File(sdcard+"/dor"); f.mkdir(); 

Это создаст папку с именем dor в вашей SD-карте. Затем для получения файла для eg- filename.json, который вручную вставлен в папку dor . Подобно:

  File file1 = new File(sdcard,"/dor/fitness.json"); ....... ..... 

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

И не забудьте добавить код в манифест

  //Create File object for Parent Directory File wallpaperDir = new File(Environment.getExternalStorageDirectory().getAbsoluteFile() +File.separator + "wallpaper"); if (!wallpaperDir.exists()) { wallpaperDir.mkdir(); } File out = new File(wallpaperDir, wallpaperfile); FileOutputStream outputStream = new FileOutputStream(out); 

Просто закончив пост Виджая …


манифест

 uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" 

функция

 public static boolean createDirIfNotExists(String path) { boolean ret = true; File file = new File(Environment.getExternalStorageDirectory(), path); if (!file.exists()) { if (!file.mkdirs()) { Log.e("TravellerLog :: ", "Problem creating Image folder"); ret = false; } } return ret; } 

Применение

 createDirIfNotExists("mydir/"); //Create a directory sdcard/mydir createDirIfNotExists("mydir/myfile") //Create a directory and a file in sdcard/mydir/myfile.txt 

Вы можете проверить наличие ошибок

 if(createDirIfNotExists("mydir/")){ //Directory Created Success } else{ //Error } 

Это сделает папку в sdcard с именем папки, которое вы предоставляете.

 File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Folder name"); if (!file.exists()) { file.mkdirs(); } 

Вы можете использовать / sdcard / вместо Environment.getExternalStorageDirectory ()

 private static String DB_PATH = "/sdcard/Android/data/com.myawesomeapp.app/"; File dbdir = new File(DB_PATH); dbdir.mkdirs(); 
 ivmage.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent i = new Intent( Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(i, RESULT_LOAD_IMAGE_ADD); } });`