android将下载的图片显示到媒体相册中

 /**
     *
     * @param context
     * @param bitmap
     * @param type 0 png 1 jpeg
     */
    private void saveImageToGallery(Context context, Bitmap bitmap ,int type) {
        // Create screenshot directory if it doesn't exist
        String dirName = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) + File.separator + "MImages";//MImages 为相册名称,可以自己更改,注意不要和系统的相册名重复
        File fileDir = new File(dirName);
        if (!fileDir.exists()) {
            fileDir.mkdir();
        }
        long mImageTime = System.currentTimeMillis();//取当前系统时间
        // media provider uses seconds for DATE_MODIFIED and DATE_ADDED, but milliseconds
        // for DATE_TAKEN
        long dateSeconds = mImageTime / 1000;
        String mImageFileName = dateSeconds + (type == 1?".jpeg": ".png"); //以保存时间命名
        String mImageFilePath = dirName + File.separator + mImageFileName; //注意这里的mImageFilePath是: 目录名称+文件名
        int mImageWidth = bitmap.getWidth();
        int mImageHeight = bitmap.getHeight();

        // Save the screenshot to the MediaStore
        ContentValues values = new ContentValues();
        ContentResolver resolver = context.getContentResolver();
        values.put(MediaStore.Images.ImageColumns.DATA, mImageFilePath);
        values.put(MediaStore.Images.ImageColumns.TITLE, mImageFileName);
        values.put(MediaStore.Images.ImageColumns.DISPLAY_NAME, mImageFileName);
        values.put(MediaStore.Images.ImageColumns.DATE_TAKEN, mImageTime);
        values.put(MediaStore.Images.ImageColumns.DATE_ADDED, dateSeconds);
        values.put(MediaStore.Images.ImageColumns.DATE_MODIFIED, dateSeconds);
        values.put(MediaStore.Images.ImageColumns.MIME_TYPE, (type == 1? "image/jpeg" : "image/png"));
        values.put(MediaStore.Images.ImageColumns.WIDTH, mImageWidth);
        values.put(MediaStore.Images.ImageColumns.HEIGHT, mImageHeight);
        Uri uri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

        try {
            OutputStream out = resolver.openOutputStream(uri);
            bitmap.compress((type == 0?Bitmap.CompressFormat.PNG:Bitmap.CompressFormat.JPEG), 100, out);
            out.flush();
            out.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // update file size in the database
        values.clear();
        values.put(MediaStore.Images.ImageColumns.SIZE, new File(mImageFilePath).length());
        resolver.update(uri, values, null, null);
    }

这个方式是参照了android 系统的截屏源码进行修改的。以前看过别人写的方式是先将图片保存到本地后通过广播进行媒体库的刷新,这种方式并不能很好的达到我们的需求。而且随着android 系统的升级,这种方式也逐渐被官方屏蔽。还有一点,同学们在获取本地文件路径时一定要用Eviroment,否则可能出现意想不到的问题。
有同学又会问,系统不是提供了方法么MediaStore.Images.Media.insertImage(getContentResolver(), “image path”, “title”, “description”);是的,但是这个方法并不能让你立刻将图片显示到相册,需要刷新相册,但是刷新相册也不一定能成功。故不用。

-----------------------------------------这里更新---------------------------------------------------
最近在使用过程中,出现了内存溢出的问题,当然,是在很老的旧手机上。
修改代码如下,将

Bitmap bitmap = BitmapFactory.decodeFile(oldpaths.getAbsolutePath());

方法删除。

加入这些方法

BitmapFactory.Options opt = new BitmapFactory.Options();
                            // 这个isjustdecodebounds很重要
                            opt.inJustDecodeBounds = true;
                            Bitmap bm = BitmapFactory.decodeFile(oldpaths.getAbsolutePath(), opt);
                            //此时的bm是null 取宽高需要用opt
                            // 获取到这个图片的原始宽度和高度
                            int picWidth = opt.outWidth;
                            int picHeight = opt.outHeight;

                            FileInputStream inputStream = new FileInputStream(oldpaths.getAbsoluteFile());
 /**
     *  保存图片到相册
     * @param context
     * @param 
     * @param type 0 png 1 jpeg
     * @param picWidth
     * @param picHeight
     */
    private void saveImageToGallery(Context context, InputStream inputStream, int type, File toFile, int picWidth, int picHeight) {
        // Create screenshot directory if it doesn't exist
        String dirName = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) + File.separator + "Camera";//MImages 为相册名称,可以自己更改,注意不要和系统的相册名重复
        File fileDir = new File(dirName);
        if (!fileDir.exists()) {
            fileDir.mkdir();
        }
        long mImageTime = System.currentTimeMillis();//取当前系统时间
//        // media provider uses seconds for DATE_MODIFIED and DATE_ADDED, but milliseconds
//        // for DATE_TAKEN
        long dateSeconds = mImageTime / 1000;
//        String mImageFileName = dateSeconds + (type == 1?".jpeg": ".png"); //以保存时间命名
//        String mImageFilePath = dirName + File.separator + mImageFileName; //注意这里的mImageFilePath是: 目录名称+文件名
        String mImageFileName = toFile.getName();
        String mImageFilePath = toFile.getAbsolutePath(); //注意这里的mImageFilePath是: 目录名称+文件名
//        int mImageWidth = bitmap.getWidth();
//        int mImageHeight = bitmap.getHeight();
        int mImageWidth = picWidth;
        int mImageHeight = picHeight;

        // Save the screenshot to the MediaStore
        ContentValues values = new ContentValues();
        ContentResolver resolver = context.getContentResolver();
        values.put(MediaStore.Images.ImageColumns.DATA, mImageFilePath);
        values.put(MediaStore.Images.ImageColumns.TITLE, mImageFileName);
        values.put(MediaStore.Images.ImageColumns.DISPLAY_NAME, mImageFileName);
        values.put(MediaStore.Images.ImageColumns.DATE_TAKEN, mImageTime);
        values.put(MediaStore.Images.ImageColumns.DATE_ADDED, dateSeconds);
        values.put(MediaStore.Images.ImageColumns.DATE_MODIFIED, dateSeconds);
        values.put(MediaStore.Images.ImageColumns.MIME_TYPE, (type == 1? "image/jpeg" : "image/png"));
        values.put(MediaStore.Images.ImageColumns.WIDTH, mImageWidth);
        values.put(MediaStore.Images.ImageColumns.HEIGHT, mImageHeight);
        Uri uri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

        try {
            OutputStream out = resolver.openOutputStream(uri);
//            bitmap.compress((type == 0?Bitmap.CompressFormat.PNG:Bitmap.CompressFormat.JPEG), 100, out);
            out.write(readInputStream(inputStream));
            out.flush();
            out.close();
            inputStream.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // update file size in the database
        values.clear();
        values.put(MediaStore.Images.ImageColumns.SIZE, new File(mImageFilePath).length());
        resolver.update(uri, values, null, null);
    }

    public byte[] readInputStream(InputStream inputStream) throws IOException {
        byte[] buffer = new byte[1024];
        int len = 0;
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        while ((len = inputStream.read(buffer)) != -1) {
            bos.write(buffer, 0, len);
        }
        bos.close();
        return bos.toByteArray();
    }
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值