Android--解决图片保存到相册显示1970年1月1日 8:00的问题
- 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;
- }
- }
Android--解决图片保存到相册显示1970年1月1日 8:00的问题的更多相关文章
- 1970年1月1日(00:00:00 GMT)Unix 时间戳(Unix Timestamp)
转载自(http://jm.ncxyol.com/post-88.html) 今天在看Python API时,看到time模块: The epoch is the point where the ...
- Android将图片保存到相册并及时看到
Android中将图片保存到SD卡中,相册里不会及时出现这张图片,因为没有及时更新其索引,一般需要开机几次.当然我们可以手动更新其索引. 1,首先将文件保存到SD卡中. String filePath ...
- [RN] React Native 图片保存到相册(支持 Android 和 ios)
React Native 图片保存到相册(支持 Android 和 ios) 原理: IOS用 RN自带的 CameraRoll, Android 使用 不成功,需要 react-native-fs ...
- 小程序图片保存的相册授权失败问题,原接口wx.openSeting()已经废弃了的解决办法
项目中使用的是wepy框架开发的小程序,,, 使用场景是,用户点击下载图片的时候,要调起授权button(小程序拉起授权的功能都集成在了button组件,所以这里需要用到button组件里的一个ope ...
- java为啥计算时间从1970年1月1日开始
http://www.myexception.cn/program/1494616.html ————————————————————————————————————————————————————— ...
- Java 获取各时区时间,获取当前时间到格林威治时间1970年01月01日00时00分00秒的秒数
格林威治时间即UTC/GMT时间,1970年01月01日00时00分00秒(即UTC+8的北京时间1970年01月01日08时00分00秒)计算代码如下: /** * 获取指定时间到格林威治时间的秒数 ...
- 从1970年1月1日00:00:00 GMT以来此时间对象表示的毫秒数转化为Datetime
1970年1月1日(00:00:00 GMT)Unix 时间戳(Unix Timestamp)对时间转换 将Long类型转换为DateTime类型 /// <summary> /// 将L ...
- 格林治时间,也就是返回从 UTC 1970 年 1 月 1 日午夜开始经过的毫秒数。
格林治时间,也就是返回从 UTC 1970 年 1 月 1 日午夜开始经过的毫秒数. (* Delphi获取13位格林治时间实现方法, 与java中的java.lang.System.currentT ...
- DedeCMS文章编辑不更新时间1970年1月1日
在修改文章或者后期优化的时候,织梦dedecms5.7版本存在一个问题,修改文章的同时也修改了文章的发布时间,这个功能可能有些人比较需要,但同时也有些站长朋友又不需要,因为我们编辑某个文章的时候,发现 ...
随机推荐
- ansible基础-加密
一 简介 注:本文demo使用ansible2.7稳定版 众所周知,ansible是很火的一个自动化部署工具,在ansible控制节点内,存放着当前环境服务的所有服务的配置信息,其中自然也包括一些敏感 ...
- [Swift]LeetCode61. 旋转链表 | Rotate List
Given a linked list, rotate the list to the right by k places, where k is non-negative. Example 1: I ...
- [Swift]LeetCode381. O(1) 时间插入、删除和获取随机元素 - 允许重复 | Insert Delete GetRandom O(1) - Duplicates allowed
Design a data structure that supports all following operations in averageO(1) time. Note: Duplicate ...
- [Swift]LeetCode404. 左叶子之和 | Sum of Left Leaves
Find the sum of all left leaves in a given binary tree. Example: 3 / \ 9 20 / \ 15 7 There are two l ...
- 【Spark篇】---Spark中Master-HA和historyServer的搭建和应用
一.前述 本节讲述Spark Master的HA的搭建,为的是防止单点故障. Spark-UI 的使用介绍,可以更好的监控Spark应用程序的执行. 二.具体细节 1.Master HA 1.Mast ...
- Python内置函数(3)——any
英文文档: any(iterable) Return True if any element of the iterable is true. If the iterable is empty, re ...
- ElasticSearch(1)---Mysql同步数据到ElSearch
ElasticSearch同步Mysql 先讲项目需求:对于资讯模块添加搜索功能 这个搜索功能我就是采用ElasticSearch实现的,功能刚实现完,所以写这篇博客做个记录,让自己在记录下整个步骤和 ...
- mybatis框架(6)---mybatis插入数据后获取自增主键
mybatis插入数据后获取自增主键 首先理解这就话的意思:就是在往数据库表中插入一条数据的同时,返回该条数据在数据库表中的自增主键值. 有什么用呢,举个例子: 你编辑一条新闻,同时需要给该新闻打上标 ...
- I-think-3
一段很有哲理的话,与大家分享一下: 时光匆匆, 有些东西很重要,有些东西不重要, 有些东西已经不再重要,有些东西还是很重要. 宏观地看待人生,大学文凭只是一种达到目标的途径,而并非是唯一. 主要坚定自 ...
- 《连连看》算法c语言演示(自动连连看)
(图片是游戏的示意图,来自互联网,与本文程序无关) 看题目就知道是写给初学者的,没需要的就别看了,自己都觉得怪无聊的. 很多游戏的耐玩性都来自精巧的算法,特别是人工智能的水平.比如前几天看了著名的Al ...