首页 >Android相关

Glide实现查看图片和保存图片到手机

2017-07-05 13:57 编辑: 四门三连 分类:Android相关 来源:Panda Fang

两种方式, 推荐方式一

方式一 downloadOnly

创建一个 ImageActivity

public class ImageActivity extends AppCompatActivity {
    private static final String TAG = "ImageActivity";
    private ImageView iv;
    Bitmap bitmap;
    private String mUrl;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_image);
        iv = (ImageView) findViewById(R.id.iv);
        // 图片的url 从另一个Activity传过来
        String url = getIntent().getStringExtra(EXTRA_URL);
        mUrl = url;
        loadImage(url);
        // 长按 ImageView 把图片保存到手机
        iv.setOnLongClickListener(new View.OnLongClickListener(){
            @Override
            public boolean onLongClick(View v) {
                download(mUrl)
                return true;
            }
        });
    }
    public void loadImage(String url) {
        Glide.with(this).load(url).placeholder(R.drawable.image_loading)
            .diskCacheStrategy(DiskCacheStrategy.SOURCE)
            .listener(new RequestListener() {
                @Override
                public boolean onException(Exception e, String model, Target target, boolean isFirstResource) {
                    return false;
                }
                @Override
                public boolean onResourceReady(GlideDrawable resource, String model, Target target, boolean isFromMemoryCache, boolean isFirstResource) {
                    Log.d(TAG, "onResourceReady: mode: " + model);
                    // 如果return true; 则 into(iv) 不起作用, 要手动设置图片
                    // iv.setImageDrawable(resource);
                    return false;
                }
            })
            .into(iv);
    }
    public void download(final String url) {
        new AsyncTask() {
            @Override
            protected File doInBackground(Void... params) {
                File file = null;
                try {
                    FutureTarget  future = Glide
                            .with(ImageActivity.this)
                            .load(url)
                            .downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL);
                    file = future.get();
                    // 首先保存图片
                    File pictureFolder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsoluteFile();
                    File appDir = new File(pictureFolder ,"Beauty");
                    if (!appDir.exists()) {
                        appDir.mkdirs();
                    }
                    String fileName = System.currentTimeMillis() + ".jpg";
                    File destFile = new File(appDir, fileName);
                    FileUtil.copy(file, destFile);
                    // 最后通知图库更新
                    sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
                            Uri.fromFile(new File(destFile.getPath()))));
                } catch (Exception e) {
                    Log.e(TAG, e.getMessage());
                }
                return file;
            }
            @Override
            protected void onPostExecute(File file) {
                Toast.makeText(ImageActivity.this, "saved in Pictures/GankBeauty", Toast.LENGTH_SHORT).show();
            }
            @Override
            protected void onProgressUpdate(Integer... values) {
                super.onProgressUpdate(values);
            }
        }.execute();
    }
}

以上代码 从另一个activity得到 图片的 url , 然后使用Glide 图片加载库 将图片显示到 ImageView上, 长按ImageView可以将图片保存到手机的 Pictures/Beauty 目录中

这是基本的代码模板, 实际情况更复杂,比如Android 6 还有运行时申请存储权限的问题。

方式二 asBitmap  bitmap.compress

还有一种保存图片的方式也有很多人用,但是经过我对比发现并不好,推荐上面的方式。另一种方式的代码如下

把上面 loadImage 换成 下面的 loadBitmap

    public void loadBitmap(String url) {
        Glide.with(this).load(url).asBitmap().placeholder(R.drawable.image_loading)
                .listener(new RequestListener() {
                    @Override
                    public boolean onException(Exception e, String model, Target target, boolean isFirstResource) {
                        return false;
                    }
                    @Override
                    public boolean onResourceReady(Bitmap resource, String model, Target target, boolean isFromMemoryCache, boolean isFirstResource) {
                        Log.i(TAG, "onResourceReady: thread is " + Thread.currentThread().getName());
                        isReady = true;
                        bitmap = resource;
                        iv.setImageBitmap(resource);
 
                        return false;
                    }
                })
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .into(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL);
    }

把上面的 download 换成下面的 saveImage

public void saveImage() {
        // 首先保存图片
        File file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsoluteFile();
        File appDir = new File(file ,"Beauty");
        boolean createed = false;
        if (!appDir.exists()) {
            createed =  appDir.mkdirs();
        }
        String fileName = System.currentTimeMillis() + ".jpg";
        File currentFile = new File(appDir, fileName);
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(currentFile);
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
            fos.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (fos != null) {
                    fos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        // 最后通知图库更新
        this.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
                Uri.fromFile(new File(currentFile.getPath()))));
    }

这种方式把图片变成bitmap , 保存的时候又重新压缩bitmap 保存到手机。

总结

从电脑下载图片,然后与保存到手机的图片对比,发现bitmap的方式得到的图片体积变大。

而第一种方式下载的图片与从电脑上下载的图片体积一致,md5一致。

所以推荐downloadOnly方式

作者:Panda Fang

出处:http://www.cnblogs.com/lonkiss/p/7119062.html

搜索CocoaChina微信公众号:CocoaChina
微信扫一扫
订阅每日移动开发及APP推广热点资讯
公众号:
CocoaChina
我要投稿   收藏文章
上一篇:你知道Thread线程是如何运作的吗?
下一篇:在Android N通知栏上实现直接回复消息

相关资讯

我来说两句
发表评论
您还没有登录!请登录注册
所有评论(0

综合评论

相关帖子

sina weixin mail 回到顶部