写写笔记记录一下项目中写的图片浏览及系统图库保存的功能,先看看效果:
如上,类似于相册浏览,最终将图片保存在本地,在系统图库可浏览,至于可缩放的imageview就不做说明了,直接用了,做法很多可以自行google,下面代码主要说明怎样从网络保存到本地图库的
首先findviewbyid获得保存按钮,点击事件中做图片保存:
//点击保存按钮,将当页图片保存在本地 mTvSave.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //下载图片 saveBitmap(); mSaveDialog = ProgressDialog.show(ViewPagerActivity.this, "保存图片", "图片正在保存中,请稍等...", true); mSaveDialog.setCancelable(true); } });点击保存按钮首先执行保存图片的saveBitmap()方法并弹出保存图片的对话框,接下来看看saveBitmap()方法:
/** * 获取图片bitmap,开启储存本地的线程 */ public void saveBitmap(){ String time = String.valueOf(System.currentTimeMillis()); mFileName = time + ".jpg"; Glide.with(ViewPagerActivity.this).load(filePath).asBitmap().diskCacheStrategy(DiskCacheStrategy.NONE) .skipMemoryCache(true) .into(new SimpleTarget<Bitmap>() { @Override public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) { if(null!=resource) { mBitmap=resource; new Thread(saveFileRunnable).start(); } } }); }如上代码,在此方法中以当前时间毫秒值为图片名称,使用glide库加载图片获得bitmap对象,同时开启本地写入图片的子线程,如下:
/** * 开启子线程将图片保存到本地 */ private Runnable saveFileRunnable = new Runnable() { @Override public void run() { try { saveFile(mBitmap, mFileName); mSaveMessage = "图片保存成功!"; //通知系统图册更新 Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); Uri uri = Uri.fromFile(myCaptureFile); intent.setData(uri); ViewPagerActivity.this.sendBroadcast(intent); } catch (IOException e) { mSaveMessage = "图片保存失败!"; e.printStackTrace(); } messageHandler.sendMessage(messageHandler.obtainMessage()); } };在子线程中通过saveFile方法将图片储存到本地,如果保存成功将通知系统刷新系统图库以最快展示出刚下载的图片(此时可去系统图库中查看),不管成功或者失败都将相应的消息发送出去,以显示给用户。下面是保存图片的方法:
/** * 保存文件 * * @param bm * @param fileName * @throws IOException */ public void saveFile(Bitmap bm, String fileName) throws IOException { dirFile = new File(ALBUM_PATH); if (!dirFile.exists()) { dirFile.mkdir(); } myCaptureFile = new File(ALBUM_PATH + fileName); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile)); if (bm != null) { bm.compress(Bitmap.CompressFormat.JPEG, 80, bos); } bos.flush(); bos.close(); }先判断有没有文件,没有就创建一个,其中ALBUM_PATH,为图片文件夹,
private final static String ALBUM_PATH = Environment.getExternalStorageDirectory() + "/downloadpictures/";然后用输出流将文件写入本地。
最后就是handler接收和处理消息:隐藏对话框,将收到的消息吐司给用户。
//展示子线程消息 private Handler messageHandler = new Handler() { @Override public void handleMessage(Message msg) { mSaveDialog.dismiss(); Toast.makeText(ViewPagerActivity.this, mSaveMessage, Toast.LENGTH_SHORT).show(); } };至此,图片保存本地以及可在系统相册时时查看就做完了。