android – enregistrer l’image dans la galerie

J’ai une application avec une galerie d’images et je veux que l’utilisateur puisse l’enregistrer dans sa propre galerie. J’ai créé un menu d’options avec une seule voix “enregistrer” pour permettre cela, mais le problème est … comment puis-je enregistrer l’image dans la galerie?

c’est mon 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); } } 

Je ne suis pas sûr de cette partie du code:

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

est-il correct de sauvegarder dans la galerie? malheureusement le code ne fonctionne pas 🙁

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

L’ancien code appenda l’image à la fin de la galerie. Si vous souhaitez modifier la date pour qu’elle apparaisse au début ou pour toute autre métadonnée, consultez le code ci-dessous (Cortesy of SK, 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, Ssortingng, Ssortingng) */ public static final Ssortingng insertImage(ContentResolver cr, Bitmap source, Ssortingng title, Ssortingng 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; Ssortingng ssortingngUrl = 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) { ssortingngUrl = url.toSsortingng(); } return ssortingngUrl; } /** * 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 masortingx to scale it Masortingx masortingx = new Masortingx(); float scaleX = width / source.getWidth(); float scaleY = height / source.getHeight(); masortingx.setScale(scaleX, scaleY); Bitmap thumb = Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), masortingx, 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; } } } 

En fait, vous pouvez enregistrer votre image en tout lieu. Si vous voulez enregistrer dans un espace public, pour que toute autre application puisse y accéder, utilisez ce code:

 storageDir = new File( Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES ), getAlbumName() ); 

La photo ne va pas à l’album. Pour ce faire, vous devez appeler une parsing:

 private void galleryAddPic() { Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); File f = new File(mCurrentPhotoPath); Uri contentUri = Uri.fromFile(f); mediaScanIntent.setData(contentUri); this.sendBroadcast(mediaScanIntent); } 

Vous pouvez trouver plus d’informations sur http://soffr.miximages.com/android/photobasics“, /* suffix */ storageDir /* directory */ ); return image; }

Et puis le code standard pour l’parsing des fichiers que vous pouvez trouver sur le site Google Developers également .

 public static void addPicToGallery(Context context, Ssortingng photoPath) { Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); File f = new File(photoPath); Uri contentUri = Uri.fromFile(f); mediaScanIntent.setData(contentUri); context.sendBroadcast(mediaScanIntent); } 

S’il vous plaît rappelez-vous que ce dossier ne peut pas être présent dans tous les périphériques du monde et que, à partir de Marshmallow (API 23), vous devez demander l’autorisation à WRITE_EXTERNAL_STORAGE à l’utilisateur.

Selon ce cours , la manière correcte de procéder est la suivante:

 Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES ) 

thios vous donnera le chemin racine du répertoire de la galerie.

 private void galleryAddPic() { Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); File f = new File(mCurrentPhotoPath); Uri contentUri = Uri.fromFile(f); mediaScanIntent.setData(contentUri); this.sendBroadcast(mediaScanIntent); } 

Je viens ici avec le même doute mais pour Xamarin pour Android, j’ai utilisé la réponse Sigrist pour faire cette méthode après avoir sauvegardé mon fichier:

 private void UpdateGallery() { Intent mediaScanIntent = new Intent(Intent.ActionMediaScannerScanFile); Java.IO.File file = new Java.IO.File(_path); Android.Net.Uri contentUri = Android.Net.Uri.FromFile(file); mediaScanIntent.SetData(contentUri); Application.Context.SendBroadcast(mediaScanIntent); } 

et cela a résolu mon problème, Thx Sigrist. Je l’ai mis ici parce que je n’ai pas trouvé de réponse à ce sujet pour Xamarin et j’espère que cela pourra aider d’autres personnes.

Dans mon cas, les solutions ci-dessus ne fonctionnaient pas. Je devais faire ce qui suit:

 sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(f))); 

Vous pouvez créer un répertoire dans le dossier de la caméra et enregistrer. Et scannez une fois que vous avez terminé. Il affichera instantanément votre image dans la galerie. À votre santé!!

  Ssortingng root = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).toSsortingng()+ "/Camera/Your_Directory_Name"; File myDir = new File(root); myDir.mkdirs(); Ssortingng fname = "Image-" + image_name + ".png"; File file = new File(myDir, fname); System.out.println(file.getAbsolutePath()); if (file.exists()) file.delete(); Log.i("LOAD", root + fname); try { FileOutputStream out = new FileOutputStream(file); finalBitmap.compress(Bitmap.CompressFormat.PNG, 90, out); out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); } MediaScannerConnection.scanFile(context, new Ssortingng[]{file.getPath()}, new Ssortingng[]{"image/jpeg"}, null); 
  Ssortingng filePath="/storage/emulated/0/DCIM"+app_name; File dir=new File(filePath); if(!dir.exists()){ dir.mkdir(); } 

Ce code est dans la méthode onCreate. Ce code sert à créer un répertoire app_name. Maintenant, ce répertoire est accessible en utilisant l’application de gestionnaire de fichiers par défaut dans Android. Utilisez cette chaîne filePath si nécessaire pour définir votre dossier de destination. Je suis sûr que cette méthode fonctionne aussi sur Android 7 parce que je l’ai testée. Par conséquent, elle peut également fonctionner sur d’autres versions d’Android.