Saya memiliki aplikasi dengan galeri gambar dan saya ingin pengguna dapat menyimpannya ke galerinya sendiri. Saya telah membuat menu opsi dengan satu suara "simpan" untuk mengizinkannya, tetapi masalahnya adalah ... bagaimana cara menyimpan gambar ke galeri?
ini kode saya:
@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);
}
}
saya tidak yakin dengan bagian kode ini:
File root = Environment.getExternalStorageDirectory();
File file = new File(root.getAbsolutePath()+"/DCIM/Camera/img.jpg");
apakah benar menyimpan ke galeri? sayangnya kodenya tidak berfungsi :(
android
imageview
gallery
save-image
Christian Giupponi
sumber
sumber
Jawaban:
MediaStore.Images.Media.insertImage(getContentResolver(), yourBitmap, yourTitle , yourDescription);
Kode sebelumnya akan menambahkan gambar di akhir galeri. Jika Anda ingin mengubah tanggal agar muncul di awal atau metadata lainnya, lihat kode di bawah ini (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, 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; } } }
sumber
.git
di bagian akhir)Sebenarnya, Anda dapat menyimpan gambar Anda di sembarang tempat. Jika Anda ingin menyimpan di ruang publik, agar aplikasi lain dapat mengakses, gunakan kode ini:
storageDir = new File( Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES ), getAlbumName() );
Gambar tidak masuk ke album. Untuk melakukan ini, Anda perlu memanggil scan:
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); }
Anda dapat menemukan info lebih lanjut di https://developer.android.com/training/camera/photobasics.html#TaskGallery
sumber
Environment.getExternalStoragePublicDirectory
danIntent.ACTION_MEDIA_SCANNER_SCAN_FILE
tidak digunakan lagi sekarang ...Saya sudah mencoba banyak hal agar ini berfungsi di Marshmallow dan Lollipop. Akhirnya saya akhirnya memindahkan gambar yang disimpan ke folder DCIM (aplikasi Google Photo baru memindai gambar hanya jika ada di dalam folder ini)
public static File createImageFile() throws IOException { // Create an image file name String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss") .format(System.currentTimeInMillis()); File storageDir = new File(Environment .getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) + "/Camera/"); if (!storageDir.exists()) storageDir.mkdirs(); File image = File.createTempFile( timeStamp, /* prefix */ ".jpeg", /* suffix */ storageDir /* directory */ ); return image; }
Dan kemudian kode standar untuk memindai file yang dapat Anda temukan di situs Google Developers juga .
public static void addPicToGallery(Context context, String 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); }
Harap diingat bahwa folder ini tidak dapat hadir di setiap perangkat di dunia dan mulai dari Marshmallow (API 23), Anda perlu meminta izin ke WRITE_EXTERNAL_STORAGE kepada pengguna.
sumber
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)
melakukan trik untuk saya. Terima kasih!getExternalStoragePublicDirectory()
sekarang tidak digunakan lagi di API 29. Perlu menggunakan MediaStoreMenurut kursus ini , cara yang benar untuk melakukannya adalah:
Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES )
Ini akan memberi Anda jalur root untuk direktori galeri.
sumber
Environment.getExternalStoragePublicDirectory
sudah tidak digunakan lagi ...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); }
sumber
Anda dapat membuat direktori di dalam folder kamera dan menyimpan gambarnya. Setelah itu, Anda cukup melakukan pemindaian. Ini akan langsung menampilkan gambar Anda di galeri.
String root = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).toString()+ "/Camera/Your_Directory_Name"; File myDir = new File(root); myDir.mkdirs(); String 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 String[]{file.getPath()}, new String[]{"image/jpeg"}, null);
sumber
Saya datang ke sini dengan keraguan yang sama tetapi untuk Xamarin untuk Android, saya telah menggunakan jawaban Sigrist untuk melakukan metode ini setelah menyimpan file saya:
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); }
dan itu memecahkan masalah saya, Thx Sigrist. Saya taruh di sini karena saya tidak menemukan jawaban tentang ini untuk Xamarin dan saya berharap ini dapat membantu orang lain.
sumber
Dalam kasus saya, solusi di atas tidak berhasil, saya harus melakukan hal berikut:
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(f)));
sumber
ContentProvider
solusi yang lebih disukaiString filePath="/storage/emulated/0/DCIM"+app_name; File dir=new File(filePath); if(!dir.exists()){ dir.mkdir(); }
Kode ini ada dalam metode onCreate. Kode ini untuk membuat direktori app_name. Sekarang, direktori ini dapat diakses menggunakan aplikasi file manager default di android. Gunakan filePath string ini jika diperlukan untuk menyetel folder tujuan Anda. Saya yakin metode ini juga berfungsi di Android 7 karena saya telah mengujinya, sehingga dapat berfungsi di versi Android lain juga.
sumber