Android笔记之 文件保存、压缩与清空删除
2016-03-14 15:45
489 查看
这两天改进优化项目中图片上传的代码。考虑到可能有7、8M的比較大的图片,由于要先进行压缩。所以设计到文件的压缩,保存与清空删除操作。
在这里记下笔记。
在这里记下笔记。
/** * 压缩并另存为,每次先清空再保存 */ private void compressFile(){ //清空保存文件夹下的旧照片 String saveDir = Environment.getExternalStorageDirectory() + "/bag/uploadPictures"; File imageDir = new File(saveDir); if (imageDir.exists()) { clearFolder(imageDir); }else{ imageDir.mkdirs(); } //推断图片大小。大于300k则压缩 for (int i = 0; i < imagePathList.size(); i++) { Bitmap bitmap = compressImage(imagePathList.get(i)); imagePathList.set(i, saveImage(saveDir,bitmap)); } } /**保存图片,输入保存文件夹和bitmap。以日期命名。返回保存路径 * * @param path * @param bitmap * @return */ private String saveImage(String path ,Bitmap bitmap){ Date dt = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); String imageName =sdf.format(dt)+".jpg"; File file = new File(path,imageName ); if (file.exists()) { file.delete(); } try { FileOutputStream out = new FileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out); out.flush(); out.close(); Log.d(TAG, "图片已经保存"); return path+"/"+imageName; } catch (FileNotFoundException e) { Log.d(TAG, "文件不存在"); e.printStackTrace(); return ""; } catch (IOException e) { Log.d(TAG, "IO异常"+e.toString()); e.printStackTrace(); return ""; } } /** * 压缩图片 * @param imagePath * @return */ private Bitmap compressImage(String imagePath) { PhotoUpBitmapCache bitmapCache = new PhotoUpBitmapCache(); //取1280*720大小 Bitmap image = bitmapCache.revitionImage(imagePath, 1280,720); //用以下这个行代码会造成OOM,所以必须用Android 自带的方法去先压缩再导入 // Bitmap image = BitmapFactory.decodeFile(imagePath); ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩。把压缩后的数据存放到baos中 int options = 100; while ( baos.toByteArray().length /1024 > 300) { //循环推断假设压缩后图片是否大于100kb,大于继续压缩 baos.reset();//重置baos即清空baos image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中 options -= 5;//每次都降低5% } ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中 Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片 Log.d(TAG, "文件压缩成功"); return bitmap; } /** * 清空文件夹里面全部子文件 */ private void clearFolder(File file) { if(file.isDirectory()){ File[] childFiles = file.listFiles(); if (childFiles == null || childFiles.length == 0) { return; } for (int i = 0; i < childFiles.length; i++) { childFiles[i].delete(); } return ; } }
相关文章推荐
- 如何用Fiddler对Android应用进行抓包
- 如何用Fiddler对Android应用进行抓包
- 如何用Fiddler对Android应用进行抓包
- Android Studio 导入jar包和第三方开源库方法
- Android开发之播放视频
- Android开发&HTML5+App
- 在Mac中配置Android的环境变量
- Android Studio使用butterknife注解框架插件Android Butterknife Zelezny
- Android屏幕适配全攻略(最权威的官方适配指导)
- Android之zxing二维码生成与识别
- 最受欢迎的5个Android ORM框架
- Android 编译使用CCACHE
- Android 应用自动更新
- android中.classpath和.project作用
- Android静态工具类ToastUtil因为传入content不当导致Activity内存泄露
- android设置EditText不弹出软键盘
- 加载优化之缓存Lru,滑动停止的时候开始加载,滑动的时候不加载
- java Android之Activity之间简单的信息传递
- Android多媒体开发笔记-- AwesomePlayer基本框架及播放流程
- Android动态部署二:APK安装及AndroidManifest.xml解析流程分析