package com.jerey.keepgank.utils;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Environment;
import android.provider.MediaStore;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.ref.WeakReference;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
/**
* Created by xiamin on 3/3/17.
*/
public class ImageSave {
private static final String TAG = "ImageSave";
private static final String TYPE = ".jpg";
private static ScheduledExecutorService mScheduledThreadPool;
//降低一下与context的耦合度,避免内存泄漏
private WeakReference<Context> mContextWeakReference;
private ImageSaveListener mListener;
private ImageSave(Context context) {
//双重校验锁,保证线程安全和惰加载
if (mScheduledThreadPool == null) {
synchronized (ImageSave.class) {
if (mScheduledThreadPool == null) {
mScheduledThreadPool = Executors.newScheduledThreadPool(4);
}
}
}
mContextWeakReference = new WeakReference<Context>(context);
}
private class SaveTask extends AsyncTask<Bitmap, Void, Boolean> {
@Override
protected Boolean doInBackground(Bitmap... params) {
for (Bitmap bmp : params) {
// 首先保存图片
File appDir = new File(Environment.getExternalStorageDirectory(), TAG);
if (!appDir.exists()) {
appDir.mkdir();
}
String fileName = System.currentTimeMillis() + TYPE;
File file = new File(appDir, fileName);
try {
FileOutputStream fos = new FileOutputStream(file);
bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.flush();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
}
Context context = mContextWeakReference.get();
if (context != null) {
// 其次把文件插入到系统图库
try {
MediaStore.Images.Media.insertImage(context.getContentResolver(),
file.getAbsolutePath(), fileName, null);
} catch (FileNotFoundException e) {
e.printStackTrace();
return false;
}
// 最后通知图库更新
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
Uri.parse("file://" + Environment.getExternalStorageDirectory())));
}
}
return true;
}
@Override
protected void onPostExecute(Boolean aBoolean) {
super.onPostExecute(aBoolean);
if (mListener == null) {
return;
}
if (aBoolean == true) {
mListener.onSuccess();
} else {
mListener.onError();
}
}
}
/**
* This method will be executed by a ThreadPool
*
* @param bitmaps
* @return
*/
public ImageSave save(Bitmap... bitmaps) {
new SaveTask().executeOnExecutor(mScheduledThreadPool, bitmaps);
return this;
}
public static ImageSave with(Context context) {
return new ImageSave(context);
}
public interface ImageSaveListener {
public void onSuccess();
public void onError();
}
/**
* The listener will be in UI thread, so you can do some UI hint;
*
* @param listener
*/
public void setImageSaveListener(ImageSaveListener listener) {
mListener = listener;
}
}