资讯专栏INFORMATION COLUMN

Android--解决图片保存到相册显示1970年1月1日 8:00的问题

muddyway / 1707人阅读

摘要:保存一张或者多张图片到图库不能为图片数组为保存图片到图库请在设置授予应用存储权限保存多张图片图片已成功保存到系统相册保存到相册获得路径内存卡不可用首先保存图片获取文件存储路径创建文件截取取出名字插入图库最后通知图库更新保存到相册获得路径不传

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 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 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

相关文章

  • Linux/Unix命令行 - 关于时间和时间戳故事

    摘要:中话其实我只是想记录一下系统下关于命令行工具的使用指南,不料却回忆了一下关于时间戳的简要概念。因为我的电脑系统设置的时区是东八区的缘故,这个命令在默认情况下也是根据系统的时区优先显示所在时区的换算后的本地时间。 时间是一个神奇的东西,但我们却仅仅用一个数字来代表它 前话 在日常开发中,长期是在从事后端服务器开发,也避免不了会经常和时间打交道,例如: 玩家的首次登录时间 玩家的最后登录...

    plus2047 评论0 收藏0
  • JavaScript引用类型——“Date类型”注意要点

    摘要:类型中的类型使用自,国际协调时间年月日午夜零时开始经过的毫秒数来保存日期。类型保存的日期能够精确到年月日之前或之后的年。和的输出因浏览器不同而有所差异如年月日上午方法可用比较操作符来比较日期值。 Date 类型 ECMAScript 中的Date 类型使用自UTC(Coordinated Universal Time,国际协调时间)1970 年1 月1 日午夜(零时)开始经过的毫秒数来...

    brianway 评论0 收藏0
  • Java期类分析

    摘要:用的时候再转化成年月日时分秒。创建日期对象代表当前时间从年月日早上点分秒开始经历了毫秒也就是秒的时间获取一个时间的毫秒数,返回一个型的整数。 时间原点概念 计算机语言中的时间原点都是从1970年1月1日8点0分0秒开始算的,就相当于时间的0。为什么对应1970年呢?其实,现在大部分计算机系统使用的时间都是UNIX时间,而UNIX或类UNIX系统使用的时间表示方式是:从协调世界时1970...

    Wuv1Up 评论0 收藏0
  • Date对象

    摘要:所以,两个日期对象进行减法运算,返回的就是它们间隔的毫秒数进行加法运算,返回的就是连接后的两个字符串。类设置实例对象对应的每个月的几号,返回改变后毫秒时间戳。方法返回实例对象距离年月日对应的毫秒数,该方法等同于方法。 仅个人学习的一些要点,欢迎指正,谢谢!参考资料 参数 作为普通函数调用,即使有参数,仍返回当时时间 作为构造函数是,可接受多种参数 new Date(milliseco...

    wwq0327 评论0 收藏0
  • JS基础篇--期Date详解与实例扩展

    摘要:实际上,如果直接将表示日期的字符串传递给构造函数,也会在后台调用方法,例如下面的代码跟前面的是等价的。构造函数构造函数会模仿但有一点不同的是,日期和时间都是基于本地时区而非来创建。兼容性问题啊其原因就是非标准日期格式。 一:Date类型介绍 要创建一个日期对象,使用new操作符和Date构造函数即可: var now = new Date(); Date.parse()方法 其中Da...

    Apollo 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<