/**
*
* @param context
* @param bitmap
* @param type 0 png 1 jpeg
*/
private void saveImageToGallery(Context context, Bitmap bitmap ,int type) {
// Create screenshot directory if it doesn't exist
String dirName = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) + File.separator + "MImages";//MImages 爲相冊名稱,可以自己更改,注意不要和系統的相冊名重複
File fileDir = new File(dirName);
if (!fileDir.exists()) {
fileDir.mkdir();
}
long mImageTime = System.currentTimeMillis();//取當前系統時間
// media provider uses seconds for DATE_MODIFIED and DATE_ADDED, but milliseconds
// for DATE_TAKEN
long dateSeconds = mImageTime / 1000;
String mImageFileName = dateSeconds + (type == 1?".jpeg": ".png"); //以保存時間命名
String mImageFilePath = dirName + File.separator + mImageFileName; //注意這裏的mImageFilePath是: 目錄名稱+文件名
int mImageWidth = bitmap.getWidth();
int mImageHeight = bitmap.getHeight();
// Save the screenshot to the MediaStore
ContentValues values = new ContentValues();
ContentResolver resolver = context.getContentResolver();
values.put(MediaStore.Images.ImageColumns.DATA, mImageFilePath);
values.put(MediaStore.Images.ImageColumns.TITLE, mImageFileName);
values.put(MediaStore.Images.ImageColumns.DISPLAY_NAME, mImageFileName);
values.put(MediaStore.Images.ImageColumns.DATE_TAKEN, mImageTime);
values.put(MediaStore.Images.ImageColumns.DATE_ADDED, dateSeconds);
values.put(MediaStore.Images.ImageColumns.DATE_MODIFIED, dateSeconds);
values.put(MediaStore.Images.ImageColumns.MIME_TYPE, (type == 1? "image/jpeg" : "image/png"));
values.put(MediaStore.Images.ImageColumns.WIDTH, mImageWidth);
values.put(MediaStore.Images.ImageColumns.HEIGHT, mImageHeight);
Uri uri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
try {
OutputStream out = resolver.openOutputStream(uri);
bitmap.compress((type == 0?Bitmap.CompressFormat.PNG:Bitmap.CompressFormat.JPEG), 100, out);
out.flush();
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// update file size in the database
values.clear();
values.put(MediaStore.Images.ImageColumns.SIZE, new File(mImageFilePath).length());
resolver.update(uri, values, null, null);
}
這個方式是參照了android 系統的截屏源碼進行修改的。以前看過別人寫的方式是先將圖片保存到本地後通過廣播進行媒體庫的刷新,這種方式並不能很好的達到我們的需求。而且隨着android 系統的升級,這種方式也逐漸被官方屏蔽。還有一點,同學們在獲取本地文件路徑時一定要用Eviroment,否則可能出現意想不到的問題。
有同學又會問,系統不是提供了方法麼MediaStore.Images.Media.insertImage(getContentResolver(), “image path”, “title”, “description”);是的,但是這個方法並不能讓你立刻將圖片顯示到相冊,需要刷新相冊,但是刷新相冊也不一定能成功。故不用。