Как автоматически создать каталог на SD-карте
Я пытаюсь сохранить файл в следующем месте
FileOutputStream fos = new FileOutputStream("/sdcard/Wallpaper/"+fileName);
но я получаю исключение java.io.FileNotFoundException
Однако, когда я помещаю путь как "/sdcard/"
, он работает.
Теперь я предполагаю, что я не могу автоматически создать каталог таким образом.
Может кто-нибудь предложить, как создать directory and sub-directory
с помощью кода?
Ответы
Ответ 1
Если вы создаете объект 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-карта" поскольку это может измениться, если приходит телефон, у которого есть что-то другое, кроме SD-карты (например, встроенная вспышка, a'la iPhone). В любом случае вы должны иметь в виду, что вам нужно проверить, чтобы убедиться, что он действительно там, поскольку SD-карта может быть удалена.
ОБНОВЛЕНИЕ: Начиная с API уровня 4 (1.6), вам также потребуется запросить разрешение. Что-то вроде этого (в манифесте) должно работать:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Ответ 2
Имел ту же проблему и просто хочу добавить, что AndroidManifest.xml также нуждается в этом разрешении:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Ответ 3
Вот что работает для меня.
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;
}
Ответ 4
На самом деле я использовал часть @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(), чтобы создать полный путь
Ответ 5
С API 8 и выше местоположение SD-карты изменилось. Ответ @fiXedd хорош, но для безопасного кода вы должны использовать Environment.getExternalStorageState()
, чтобы проверить, доступен ли носитель. Затем вы можете использовать getExternalFilesDir()
для перехода к нужной директории (при условии, что вы используете API 8 или выше).
Подробнее в документации SDK вы можете прочитать.
Ответ 6
Убедитесь, что имеется внешнее хранилище:
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);
}
Ответ 7
Я столкнулся с той же проблемой. В 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();
}
}
}
}
Ответ 8
Я столкнулся с такой же проблемой, не смог создать каталог на Galaxy S, но смог создать ее на Nexus и Samsung Droid. Как я исправил это, добавив следующую строку кода:
File dir = new File(Environment.getExternalStorageDirectory().getPath()+"/"+getPackageName()+"/");
dir.mkdirs();
Ответ 9
Не забудьте убедиться, что у вас нет специальных символов в именах файлов/папок. Случилось со мной: "Когда я устанавливал имена папок с помощью переменных (-ов)
не разрешены символы в именах файлов/папок
"*/: < > ?\|
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");
}
}
Ответ 10
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");
.......
.....
< use-permission android: name= "android.permission.WRITE_EXTERNAL_STORAGE" /" >
и не забудьте добавить код в манифест
Ответ 11
//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);
Ответ 12
Просто закончив пост Виджей...
манифеста
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
}
Ответ 13
Это сделает папку в SD-карте с именем папки, которое вы предоставляете.
File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Folder name");
if (!file.exists()) {
file.mkdirs();
}
Ответ 14
Вы можете использовать/sdcard/вместо Environment.getExternalStorageDirectory()
private static String DB_PATH = "/sdcard/Android/data/com.myawesomeapp.app/";
File dbdir = new File(DB_PATH);
dbdir.mkdirs();
Ответ 15
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);
}
});`