-
-
Save feng88724/dd7b6d2a3eaeb74b8719bf803e48ad14 to your computer and use it in GitHub Desktop.
Fixed a bug where images added to the MediaStore are not inserted at the front of the gallery
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.memtrip; | |
import java.io.FileNotFoundException; | |
import java.io.IOException; | |
import java.io.OutputStream; | |
import android.content.ContentResolver; | |
import android.content.ContentUris; | |
import android.content.ContentValues; | |
import android.graphics.Bitmap; | |
import android.graphics.Matrix; | |
import android.net.Uri; | |
import android.provider.MediaStore; | |
import android.provider.MediaStore.Images; | |
/** | |
* 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() / 1000); | |
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; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment