摘要:保存一张或者多张图片到图库不能为图片数组为保存图片到图库请在设置授予应用存储权限保存多张图片图片已成功保存到系统相册保存到相册获得路径内存卡不可用首先保存图片获取文件存储路径创建文件截取取出名字插入图库最后通知图库更新保存到相册获得路径不传
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 ListimgList, 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 imgList, final OnSaveImgCallBack callBack) { Observable.just(imgList) .observeOn(Schedulers.io()) .flatMap(new Function , ObservableSource
>() { @Override public ObservableSource apply(List 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 () { 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; } }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/2633.html
摘要:中话其实我只是想记录一下系统下关于命令行工具的使用指南,不料却回忆了一下关于时间戳的简要概念。因为我的电脑系统设置的时区是东八区的缘故,这个命令在默认情况下也是根据系统的时区优先显示所在时区的换算后的本地时间。 时间是一个神奇的东西,但我们却仅仅用一个数字来代表它 前话 在日常开发中,长期是在从事后端服务器开发,也避免不了会经常和时间打交道,例如: 玩家的首次登录时间 玩家的最后登录...
摘要:类型中的类型使用自,国际协调时间年月日午夜零时开始经过的毫秒数来保存日期。类型保存的日期能够精确到年月日之前或之后的年。和的输出因浏览器不同而有所差异如年月日上午方法可用比较操作符来比较日期值。 Date 类型 ECMAScript 中的Date 类型使用自UTC(Coordinated Universal Time,国际协调时间)1970 年1 月1 日午夜(零时)开始经过的毫秒数来...
摘要:实际上,如果直接将表示日期的字符串传递给构造函数,也会在后台调用方法,例如下面的代码跟前面的是等价的。构造函数构造函数会模仿但有一点不同的是,日期和时间都是基于本地时区而非来创建。兼容性问题啊其原因就是非标准日期格式。 一:Date类型介绍 要创建一个日期对象,使用new操作符和Date构造函数即可: var now = new Date(); Date.parse()方法 其中Da...
阅读 2185·2021-11-18 10:07
阅读 2115·2021-09-22 15:59
阅读 2955·2021-08-23 09:42
阅读 2097·2019-08-30 15:44
阅读 1068·2019-08-29 15:06
阅读 2078·2019-08-29 13:27
阅读 1042·2019-08-29 13:21
阅读 1308·2019-08-29 13:13