加载网络图片并点击保存图片到系统相册
1.首先在清单文件上加入相关权限

     <uses-permission android:name="android.permission.INTERNET" />        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2.定义一个ImageUtils工具类

import android.content.Context;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.net.Uri;import android.os.Environment;import android.provider.MediaStore;import android.util.Log;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;public class ImageUtils {    private static File mPhotoFile = null;    public static void setPhotoFile(File photoFile){        mPhotoFile = photoFile;    }    public static File getPhotoFile(){        return mPhotoFile;    }    /**     * 保存图片到图库     * @param bmp     */    public static void saveImageToGallery(Bitmap bmp, String bitName ) {        // 首先保存图片        File appDir = new File(Environment.getExternalStorageDirectory(),                "picture");        if (!appDir.exists()) {            appDir.mkdir();        }        String fileName = bitName + ".png";        File file = new File(appDir, fileName);        Log.v("Photo",fileName);        try {            FileOutputStream fos = new FileOutputStream(file);            bmp.compress(Bitmap.CompressFormat.PNG, 100, fos);            fos.flush();            fos.close();        } catch (FileNotFoundException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }        setPhotoFile(file);    }    /**     * @param bmp 获取的bitmap数据     * @param picName 自定义的图片名     */    public static void saveBmp2Gallery(Context context, Bitmap bmp, String picName) {        saveImageToGallery(bmp,picName);        String fileName = null;        //系统相册目录        String galleryPath = Environment.getExternalStorageDirectory()                + File.separator + Environment.DIRECTORY_DCIM                + File.separator + "Camera" + File.separator;        // 声明文件对象        File file = null;        // 声明输出流        FileOutputStream outStream = null;        try {            // 如果有目标文件,直接获得文件对象,否则创建一个以filename为名称的文件            file = new File(galleryPath, picName + ".png");            // 获得文件相对路径            fileName = file.toString();            // 获得输出流,如果文件中有内容,追加内容            outStream = new FileOutputStream(fileName);            if (outStream!=null) {                bmp.compress(Bitmap.CompressFormat.PNG, 90, outStream);            }        }catch (Exception e) {            e.getStackTrace();        } finally {            try {                if (outStream != null) {                //关闭输出流                    outStream.close();                }            } catch (IOException e) {                e.printStackTrace();            }        }//添加图片到系统相册并更新通知        MediaStore.Images.Media.insertImage(context.getContentResolver(),bmp,fileName,null);        Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);        Uri uri = Uri.fromFile(file);        intent.setData(uri);        context.sendBroadcast(intent);    }    /**     * 将URL转化成bitmap形式     * @param url     * @return bitmap type     */    public final static Bitmap returnBitMap(String url) {        URL myFileUrl;        Bitmap bitmap = null;        try {            myFileUrl = new URL(url);            HttpURLConnection conn;            conn = (HttpURLConnection) myFileUrl.openConnection();            conn.setDoInput(true);            conn.connect();            InputStream is = conn.getInputStream();            bitmap = BitmapFactory.decodeStream(is);        } catch (MalformedURLException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }        return bitmap;    }}

Notes:这里Bitmap.compress(Bitmap.CompressFormat.PNG, 90, outStream);解压缩是PNG格式的图片
推荐阅读:BitmapFactory.decodeResource为null的处理方法之一

  • 3.使用Glide加载图片

    • 3.1添加依赖
    //glide加载图片implementation 'com.github.bumptech.glide:glide:4.6.1'annotationProcessor 'com.github.bumptech.glide:compiler:4.6.1'
  • 3.2加载图片

   String imgUrl;//设置全局变量   imgURl=mData.get(0).url;//通过下标获得第一张图片       GlideApp.with(BaseApplication.getContext()).load(imgURl).apply(options).into(mImage);

4.开启子线程获取网络图片,更新UI

//保存图片必须在子线程中操作,是耗时操作                new Thread(new Runnable() {                    @Override                    public void run() {                        Bitmap bp = ImageUtils.returnBitMap(imgURl);                        if (EmptyUtils.isNotEmpty(bp))                        ImageUtils.saveBmp2Gallery(BaseApplication.getContext(), bp, "picName");                    }                }).start();

Notes:保存图片之前先一层判断,判断Bitmap对象是否为空,否则程序容易出现空指针异常错误。一旦出现空指针异常的错误,一定要去找哪一个引用没有指向实际存在的对象,导致为null

Attempt to invoke virtual method 'boolean android.graphics.Bitmap.compress(android.graphics.Bitmap$CompressFormat, int, java.io.OutputStream)' on a null object reference

5.用到的EmptyUtils工具类

import android.os.Build;import android.util.SparseArray;import android.util.SparseBooleanArray;import android.util.SparseIntArray;import android.util.SparseLongArray;import java.lang.reflect.Array;import java.util.Collection;import java.util.Map;public final class EmptyUtils {    private EmptyUtils() {        throw new UnsupportedOperationException("u can't instantiate me...");    }    /**     * 判断对象是否为空     *     * @param obj 对象     * @return {@code true}: 为空
{@code false}: 不为空 */
public static boolean isEmpty(Object obj) { if (obj == null) { return true; } if (obj instanceof String && obj.toString().length() == 0) { return true; } if (obj.getClass().isArray() && Array.getLength(obj) == 0) { return true; } if (obj instanceof Collection && ((Collection) obj).isEmpty()) { return true; } if (obj instanceof Map && ((Map) obj).isEmpty()) { return true; } if (obj instanceof SparseArray && ((SparseArray) obj).size() == 0) { return true; } if (obj instanceof SparseBooleanArray && ((SparseBooleanArray) obj).size() == 0) { return true; } if (obj instanceof SparseIntArray && ((SparseIntArray) obj).size() == 0) { return true; } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { if (obj instanceof SparseLongArray && ((SparseLongArray) obj).size() == 0) { return true; } } return false; } /** * 判断对象是否非空 * * @param obj 对象 * @return {@code true}: 非空
{@code false}: 空 */
public static boolean isNotEmpty(Object obj) { return !isEmpty(obj); }}

感谢查看!

更多相关文章

  1. 【Android】移动端接入Cronet实践
  2. My Android(安卓)Camera Notes
  3. android 项目 分享图片到微信
  4. android获取图片尺寸的两种方法以及bitmap的缩放
  5. androidU盘检测
  6. 史上最详细的Android原生APP中添加ReactNative 进行混合开发教程
  7. Android(安卓)java和javascript之间的相互调用
  8. weex android 选择文件 拍照 获得uri 并转为文件真实路径 转base
  9. Android(安卓)学习笔记(二) 各种技巧小知识

随机推荐

  1. Android编程实现屏幕自适应方向尺寸与分
  2. 20172321 2017-2018-2 《程序设计与数据
  3. Android图形系统分析与移植 -- 五、Andro
  4. Android(安卓)Fragment---创建Fragment
  5. Android学习进阶和IoC
  6. Android中自定义控件和属性
  7. Android Launcher 分析
  8. Android之RelativeLayout属性
  9. Android 相对布局 RelativeLayout 属性
  10. 创建和使用Android(安卓)library工程