androidimagesaveandroid-10.0

Save bitmap image to specific location of gallery android 10


I am using this code:

MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, "title" , "description");

and it is working well.

Problems:

  1. It is creating a folder called "Pictures" in gallery automatically. But I want different name, for example my app's name.
  2. insertImage() function of MediaStore is depreciated in android 10:

public static String insertImage (ContentResolver cr, String imagePath, String name, String description)

This method was deprecated in API level 29. inserting of images should be performed using MediaColumns#IS_PENDING, which offers richer control over lifecycle.

I have read the documentation and don't actually understand IS_PENDING and how to use it.


Solution

  • Try this code :-

    private void saveImage(Bitmap bitmap, @NonNull String name) throws IOException {
        boolean saved;
        OutputStream fos;
    
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            ContentResolver resolver = mContext.getContentResolver();
            ContentValues contentValues = new ContentValues();
            contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, name);
            contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/png");
            contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, "DCIM/" + IMAGES_FOLDER_NAME);
            Uri imageUri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
            fos = resolver.openOutputStream(imageUri);
        } else {
            String imagesDir = Environment.getExternalStoragePublicDirectory(
                    Environment.DIRECTORY_DCIM).toString() + File.separator + IMAGES_FOLDER_NAME;
    
            File file = new File(imagesDir);
    
            if (!file.exists()) {
                file.mkdir();
            }
    
            File image = new File(imagesDir, name + ".png");
            fos = new FileOutputStream(image);
    
        }
    
        saved = bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
        fos.flush();
        fos.close();
    }