Как сохранить изображение во внешнюю галерею памяти в 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 4

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();
    }

Используйте этот способ:

bitmap.compress(CompressFormat.JPEG, 100,  new FileOutputStream("/mnt/sdcard/" + new Date().getTime() + ".jpg"));`

Path : Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + File.separator + file name