Как сохранить изображение во внешнюю галерею памяти в android
Я пытаюсь записать файл изображения в папку public gallery в определенном каталоге, но постоянно получаю сообщение об ошибке, что я не могу открыть файл, потому что это каталог.
Пока что у меня есть следующее
//set the file path
String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + File.separator + directory;
File outputFile = new File(path,"testing.png");
outputFile.mkdirs();
FileOutputStream out = new FileOutputStream(outputFile);
bmp.compress(Bitmap.CompressFormat.PNG, 100, out);
Где каталог-это имя приложения. Таким образом, все фотографии, сохраненные приложением, попадут в эту папку / каталог, но я продолжаю получать ошибку
/storage/sdcard0/Pictures/appname/testing.png: open failed: EISDIR (Is a directory)
Даже если я не пытаюсь поместить его в каталог и привести переменную path в виде файла как
File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
Я не получаю ошибку, однако фотография все еще не появляется в галерее.
* * * Ответ Проблема заключалась в том, что когда я запускал этот код, он создавал каталог с именем testing.png, потому что мне не удалось создать каталог до создания файла в каталоге. Таким образом, решение состоит в том, чтобы сначала сделать каталог, а затем записать в него отдельный файл, как so
String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString() + File.separator + directory;
//directory is a static string variable defined in the class
//make a file with the directory
File outputDir = new File(path);
//create dir if not there
if (!outputDir.exists()) {
outputDir.mkdir();
}
//make another file with the full path AND the image this time, resized is a static string
File outputFile = new File(path+File.separator+resized);
FileOutputStream out = new FileOutputStream(outputFile);
bmp.compress(Bitmap.CompressFormat.PNG, 100, out);
Примечание вам может потребоваться зайти в хранилище и вручную удалить каталог, если вы сделал ту же ошибку, что и в начале
5 ответов:
Вы пытаетесь записать в каталог вместо файла. попробуйте это
String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + File.separator + directory; File outputDir= new File(path); outputDir.mkdirs(); File newFile = new File(path + File.separator + "test.png"); FileOutputStream out = new FileOutputStream(newFile); bmp.compress(Bitmap.CompressFormat.PNG, 100, out);
Ваш код корректен, только небольшие изменения нужны следующим образом,
String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + File.separator + directory; // First Create Directory File outputFile = new File(path); outputFile.mkdirs(); // Now Create File outputFile = new File(path,"testing.png"); FileOutputStream out = new FileOutputStream(outputFile); bmp.compress(Bitmap.CompressFormat.PNG, 100, out);
Также не забудьте дать разрешение WRITE_EXTERNAL_STORAGE в вашем AndroidManifest.XML-файл.
Если вы получаете эту ошибку при работе с эмулятором Android; вам нужно включить хранение SD-карты на эмуляторе.
public static String SaveImage(Bitmap finalBitmap) { String root = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString(); File myDir = new File(root + "/FolderName"); if(!myDir.exists()) myDir.mkdirs(); Random generator = new Random(); int n = 10000; n = generator.nextInt(n); String fname = "Image-"+ n +".png"; File file = new File (myDir, fname); if (file.exists ()) file.delete (); try { FileOutputStream out = new FileOutputStream(file); finalBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out); out.flush(); out.close(); } catch (Throwable e) { e.printStackTrace(); } return file.getAbsolutePath(); }