- 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, "内存卡不可用");
- return null;
- }
- // 首先保存图片
- File appDir = new File(Environment.getExternalStorageDirectory().getAbsolutePath(),
- NetWorkConstants.FileKey.COMMONLIB_SHARE_CODE_DIR_NAME);// 获取文件存储路径
-
- if (!appDir.exists()) {
- boolean isCreate = appDir.mkdir();
- if (!isCreate) {
- return null;
- }
- }
- // 创建文件 截取,取出名字
- String url_truncated = String.valueOf(System.currentTimeMillis());
- String fileName = "mryt_share_code" + "_" + url_truncated;
- File file = new File(appDir, fileName);
- FileUtils.deleteFile(file);
- if (FileUtils.isFileExists(file)) {
- LogUtils.dTag(TAG, file.getAbsolutePath());
- return file.getAbsolutePath();
- }
- try {
- FileOutputStream fos = new FileOutputStream(file);
- bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);
- fos.flush();
- fos.close();
- // 插入图库
- /**MediaStore.Images.Media
- .insertImage(context.getContentResolver(), file.getAbsolutePath(), fileName,
- String.valueOf(System.currentTimeMillis()));*/
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- // 最后通知图库更新
-
- /**MediaScannerConnection.scanFile(context, new String[]{file.getAbsolutePath()}, null,
- new MediaScannerConnection.OnScanCompletedListener() {
- @Override
- public void onScanCompleted(String path, Uri uri) {
- }
- });*/
- try {
- savePhotoToMedia(context, file, fileName);
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- }
- return file.getAbsolutePath();
- }
- /**
- * 保存 Bitmap 到相册 获得路径 不传递文件名称 用时间后缀
- */
- public static String saveImageToGallery(Context context, Bitmap bmp) {
- // 首先保存图片
- File appDir = context.getExternalFilesDir(
- NetWorkConstants.FileKey.COMMONLIB_SHARE_CODE_DIR_NAME);// 获取文件存储路径
- if (appDir != null && !appDir.exists()) {
- boolean isCreate = appDir.mkdir();
- if (!isCreate) {
- return null;
- }
- }
- if (!SDCardUtils.isSDCardEnableByEnvironment()) {
- LogUtils.dTag(TAG, "内存卡不可用");
- return null;
- }
- // 创建文件 截取,取出名字
- String url_truncated = String.valueOf(System.currentTimeMillis());
- String fileName = "mryt_share_code" + "_" + url_truncated;
- File file = new File(appDir, fileName);
- if (FileUtils.isFileExists(file)) {
- LogUtils.dTag(TAG, file.getAbsolutePath());
- return file.getAbsolutePath();
- }
- try {
- FileOutputStream fos = new FileOutputStream(file);
- bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);
- fos.flush();
- fos.close();
- // 插入图库
- /**MediaStore.Images.Media
- .insertImage(context.getContentResolver(), file.getAbsolutePath(), fileName,
- String.valueOf(System.currentTimeMillis()));*/
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- // 最后通知图库更新
- // context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));
- /**MediaScannerConnection.scanFile(context, new String[]{file.getAbsolutePath()}, null,
- new MediaScannerConnection.OnScanCompletedListener() {
- @Override public void onScanCompleted(String path, Uri uri) {
- }
- });*/
-
- try {
- savePhotoToMedia(context, file, fileName);
- ToastUtils.showShort("图片已成功保存到相册");
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- ToastUtils.showShort("图片保存失败");
- }
- return file.getAbsolutePath();
- }
- public static Bitmap getBitmapFromView(Context context, View view) {
- view.setDrawingCacheEnabled(true);
- //启用DrawingCache并创建位图
- view.buildDrawingCache();
- //创建一个DrawingCache的拷贝,因为DrawingCache得到的位图在禁用后会被回收
- Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache());
- //禁用DrawingCahce否则会影响性能
- view.setDrawingCacheEnabled(false);
- return bitmap;
- }
- //图片上绘制文字
- public static Bitmap drawTextToBitmap(Bitmap bitmap, String text,
- Paint paint, Rect bounds, int paddingLeft, int paddingTop) {
- android.graphics.Bitmap.Config bitmapConfig = bitmap.getConfig();
- paint.setDither(true); // 获取跟清晰的图像采样
- paint.setFilterBitmap(true);// 过滤一些
- if (bitmapConfig == null) {
- bitmapConfig = android.graphics.Bitmap.Config.ARGB_8888;
- }
- bitmap = bitmap.copy(bitmapConfig, true);
- Canvas canvas = new Canvas(bitmap);
- canvas.drawText(text, paddingLeft, paddingTop, paint);
- return bitmap;
- }
- public static Bitmap setImgSize(Bitmap bm, int newWidth, int newHeight) {
- // 获得图片的宽高.
- int width = bm.getWidth();
- int height = bm.getHeight();
- // 计算缩放比例.
- float scaleWidth = ((float) newWidth) / width;
- float scaleHeight = ((float) newHeight) / height;
- // 取得想要缩放的matrix参数.
- Matrix matrix = new Matrix();
- matrix.postScale(scaleWidth, scaleHeight);
- // 得到新的图片.
- return Bitmap.createBitmap(bm, 0, 0, width, height, matrix, true);
- }
- // 保存图片的回调
- public interface OnSaveImgCallBack {
- void onSaveStart();
- void onSaveSuccess();
- void onSaveFail();
- }
- public static void savePhotoToMedia(Context context, File file, String fileName)
- throws FileNotFoundException {
- String uriString = MediaStore.Images.Media
- .insertImage(context.getContentResolver(), file.getAbsolutePath(), fileName, null);
- // String uriString = MediaStore.Images.Media.insertImage(context.getContentResolver(), bitmap, null, null);
- File file1 = new File(getRealPathFromURI(Uri.parse(uriString), context));
- updatePhotoMedia(file1, context);
- }
- //更新图库
- private static void updatePhotoMedia(File file, Context context) {
- Intent intent = new Intent();
- intent.setAction(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
- intent.setData(Uri.fromFile(file));
- context.sendBroadcast(intent);
- }
- //得到绝对地址
- private static String getRealPathFromURI(Uri contentUri, Context context) {
- String[] proj = {MediaStore.Images.Media.DATA};
- Cursor cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
- if (cursor == null) {
- return "";
- }
- int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
- cursor.moveToFirst();
- String fileStr = cursor.getString(column_index);
- cursor.close();
- return fileStr;
- }
- }