import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Rect; import android.media.MediaScannerConnection; import android.net.Uri; import android.os.Environment; import android.provider.MediaStore; import android.view.View; public class PictureUtils { private static String TAG = PictureUtils.class.getSimpleName(); private static int CODE_WIDTH = 60; private static int CODE_HEIGHT = 60; private PictureUtils() { } /** * 保存一张或者多张图片到图库 */ public static void saveImageListToGallery(final BaseActivity context, final List<String> imgList, final OnSaveImgCallBack callBack) { if (context == null) { LogUtils.dTag(TAG, "context 不能为null"); return; } RxPermissionsUtils.getInstance() .requestPermission(context, RxPermissionsUtils.READ_AND_WRITE_PERMISSION, new RxPermissionsUtils.OnPermissionRequestCallBack() { @Override public void onSuccess() { if (imgList == null) { LogUtils.dTag(TAG, "图片数组为 null"); return; } // 保存图片到图库 saveImageListToGalleryPrivate(context, imgList, callBack); } @Override public void onFail() { ToastUtils.showShort("请在设置授予应用存储权限^_^"); PermissionUtils.launchAppDetailsSettings(); } }); } /** * 保存多张图片 */ private static void saveImageListToGalleryPrivate(BaseActivity context, List<String> imgList, final OnSaveImgCallBack callBack) { Observable.just(imgList) .observeOn(Schedulers.io()) .flatMap(new Function<List<String>, ObservableSource<Boolean>>() { @Override public ObservableSource<Boolean> apply(List<String> strings) throws Exception { for (String filePath : strings) { if (filePath.startsWith("http://") || filePath.startsWith("https://")) { Bitmap bmp = Glide.with(BaseApplication.getInstance()) .asBitmap() .load(filePath) .submit() .get(); saveImageToGallery(BaseApplication.getInstance(), bmp, filePath); } else { Bitmap bmp = BitmapFactory.decodeFile(filePath); saveImageToGallery(BaseApplication.getInstance(), bmp, filePath); } } return Observable.just(true); } }) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<Boolean>() { Disposable mD; @Override public void onSubscribe(Disposable d) { mD = d; if (callBack != null) { callBack.onSaveStart(); } } @Override public void onNext(Boolean aBoolean) { ToastUtils.showShort("图片已成功保存到系统相册^_^"); if (callBack != null) { callBack.onSaveSuccess(); } } @Override public void onError(Throwable e) { if (mD != null) { mD.dispose(); } if (callBack != null) { callBack.onSaveFail(); } } @Override public void onComplete() { if (mD != null) { mD.dispose(); } } }); } /** * 保存 Bitmap 到相册 获得路径 */ public static String saveImageToGallery(Context context, Bitmap bmp, String imageUrl) { if (!SDCardUtils.isSDCardEnableByEnvironment()) { LogUtils.dTag(TAG, "内