Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

android - save image into gallery

i have an app with a gallery of images and i want that the user can save it into his own gallery. I've created an option menu with a single voice "save" to allow that but the problem is...how can i save the image into the gallery?

this is my code:

@Override         public boolean onOptionsItemSelected(MenuItem item) {             // Handle item selection             switch (item.getItemId()) {             case R.id.menuFinale:                  imgView.setDrawingCacheEnabled(true);                 Bitmap bitmap = imgView.getDrawingCache();                 File root = Environment.getExternalStorageDirectory();                 File file = new File(root.getAbsolutePath()+"/DCIM/Camera/img.jpg");                 try                  {                     file.createNewFile();                     FileOutputStream ostream = new FileOutputStream(file);                     bitmap.compress(CompressFormat.JPEG, 100, ostream);                     ostream.close();                 }                  catch (Exception e)                  {                     e.printStackTrace();                 }                    return true;             default:                 return super.onOptionsItemSelected(item);             }         } 

i'm not sure of this part of code:

File root = Environment.getExternalStorageDirectory();                 File file = new File(root.getAbsolutePath()+"/DCIM/Camera/img.jpg"); 

is it correct to save into the gallery? unfortunately the code doesn't work :(

like image 887
Christian Giupponi Avatar asked Dec 19 '11 11:12

Christian Giupponi


People also ask

How do I save a picture to my gallery?

Touch and hold the image. Select a save option (e.g., Save attachment, Save to SD card, etc.). Unless otherwise specified, the image is saved to the default picture/video location (e.g., Gallery, Photos, etc.).

How do I save a picture on my Android camera roll?

To save media on Android:Tap the picture or video and hold. Tap 'Save' In the 'Gallery app', open the TextFree folder to locate the saved photo/video.


1 Answers

MediaStore.Images.Media.insertImage(getContentResolver(), yourBitmap, yourTitle , yourDescription); 

The former code will add the image at the end of the gallery. If you want to modify the date so it appears at the beginning or any other metadata, see the code below (Cortesy of S-K, samkirton):

https://gist.github.com/samkirton/0242ba81d7ca00b475b9

/**  * Android internals have been modified to store images in the media folder with   * the correct date meta data  * @author samuelkirton  */ public class CapturePhotoUtils {      /**      * A copy of the Android internals  insertImage method, this method populates the       * meta data with DATE_ADDED and DATE_TAKEN. This fixes a common problem where media       * that is inserted manually gets saved at the end of the gallery (because date is not populated).      * @see android.provider.MediaStore.Images.Media#insertImage(ContentResolver, Bitmap, String, String)      */     public static final String insertImage(ContentResolver cr,              Bitmap source,              String title,              String description) {          ContentValues values = new ContentValues();         values.put(Images.Media.TITLE, title);         values.put(Images.Media.DISPLAY_NAME, title);         values.put(Images.Media.DESCRIPTION, description);         values.put(Images.Media.MIME_TYPE, "image/jpeg");         // Add the date meta data to ensure the image is added at the front of the gallery         values.put(Images.Media.DATE_ADDED, System.currentTimeMillis());         values.put(Images.Media.DATE_TAKEN, System.currentTimeMillis());          Uri url = null;         String stringUrl = null;    /* value to be returned */          try {             url = cr.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);              if (source != null) {                 OutputStream imageOut = cr.openOutputStream(url);                 try {                     source.compress(Bitmap.CompressFormat.JPEG, 50, imageOut);                 } finally {                     imageOut.close();                 }                  long id = ContentUris.parseId(url);                 // Wait until MINI_KIND thumbnail is generated.                 Bitmap miniThumb = Images.Thumbnails.getThumbnail(cr, id, Images.Thumbnails.MINI_KIND, null);                 // This is for backward compatibility.                 storeThumbnail(cr, miniThumb, id, 50F, 50F,Images.Thumbnails.MICRO_KIND);             } else {                 cr.delete(url, null, null);                 url = null;             }         } catch (Exception e) {             if (url != null) {                 cr.delete(url, null, null);                 url = null;             }         }          if (url != null) {             stringUrl = url.toString();         }          return stringUrl;     }      /**      * A copy of the Android internals StoreThumbnail method, it used with the insertImage to      * populate the android.provider.MediaStore.Images.Media#insertImage with all the correct      * meta data. The StoreThumbnail method is private so it must be duplicated here.      * @see android.provider.MediaStore.Images.Media (StoreThumbnail private method)      */     private static final Bitmap storeThumbnail(             ContentResolver cr,             Bitmap source,             long id,             float width,              float height,             int kind) {          // create the matrix to scale it         Matrix matrix = new Matrix();          float scaleX = width / source.getWidth();         float scaleY = height / source.getHeight();          matrix.setScale(scaleX, scaleY);          Bitmap thumb = Bitmap.createBitmap(source, 0, 0,             source.getWidth(),             source.getHeight(), matrix,             true         );          ContentValues values = new ContentValues(4);         values.put(Images.Thumbnails.KIND,kind);         values.put(Images.Thumbnails.IMAGE_ID,(int)id);         values.put(Images.Thumbnails.HEIGHT,thumb.getHeight());         values.put(Images.Thumbnails.WIDTH,thumb.getWidth());          Uri url = cr.insert(Images.Thumbnails.EXTERNAL_CONTENT_URI, values);          try {             OutputStream thumbOut = cr.openOutputStream(url);             thumb.compress(Bitmap.CompressFormat.JPEG, 100, thumbOut);             thumbOut.close();             return thumb;         } catch (FileNotFoundException ex) {             return null;         } catch (IOException ex) {             return null;         }     } } 
like image 110
sebastianf182 Avatar answered Sep 27 '22 17:09

sebastianf182