/**
*
* @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”);是的,但是这个方法并不能让你立刻将图片显示到相册,需要刷新相册,但是刷新相册也不一定能成功。故不用。
-----------------------------------------这里更新---------------------------------------------------
最近在使用过程中,出现了内存溢出的问题,当然,是在很老的旧手机上。
修改代码如下,将
Bitmap bitmap = BitmapFactory.decodeFile(oldpaths.getAbsolutePath());
方法删除。
加入这些方法
BitmapFactory.Options opt = new BitmapFactory.Options();
// 这个isjustdecodebounds很重要
opt.inJustDecodeBounds = true;
Bitmap bm = BitmapFactory.decodeFile(oldpaths.getAbsolutePath(), opt);
//此时的bm是null 取宽高需要用opt
// 获取到这个图片的原始宽度和高度
int picWidth = opt.outWidth;
int picHeight = opt.outHeight;
FileInputStream inputStream = new FileInputStream(oldpaths.getAbsoluteFile());
/**
* 保存图片到相册
* @param context
* @param
* @param type 0 png 1 jpeg
* @param picWidth
* @param picHeight
*/
private void saveImageToGallery(Context context, InputStream inputStream, int type, File toFile, int picWidth, int picHeight) {
// Create screenshot directory if it doesn't exist
String dirName = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) + File.separator + "Camera";//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是: 目录名称+文件名
String mImageFileName = toFile.getName();
String mImageFilePath = toFile.getAbsolutePath(); //注意这里的mImageFilePath是: 目录名称+文件名
// int mImageWidth = bitmap.getWidth();
// int mImageHeight = bitmap.getHeight();
int mImageWidth = picWidth;
int mImageHeight = picHeight;
// 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.write(readInputStream(inputStream));
out.flush();
out.close();
inputStream.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);
}
public byte[] readInputStream(InputStream inputStream) throws IOException {
byte[] buffer = new byte[1024];
int len = 0;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while ((len = inputStream.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
bos.close();
return bos.toByteArray();
}