zoukankan      html  css  js  c++  java
  • android文件缓存,并SD卡创建目录未能解决和bitmap内存溢出解决

     1.相关代码:

        加入权限:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>  
        /** 获取SD卡路径 **/
        private static String getSDPath() {
            String sdcardPath = null;
            boolean sdCardExist = Environment.getExternalStorageState().equals(
                    android.os.Environment.MEDIA_MOUNTED);  //推断sd卡是否存在
            if (sdCardExist) {
                sdcardPath = Environment.getExternalStorageDirectory();//获取根文件夹
            }
            if (sdcardPath != null) {
                return sdcardPath;
            } else {
                return "";
            }
        }

      解决方法:获取根文件夹的代码改为:
      sdcardPath = Environment.getExternalStorageDirectory().getAbsolutePath();

    这样就能够了。

    ----------------------------------------------------------------------------------------------------------------------------------

    附文件缓存类:

    package com.etnet.utilities;
    
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.Arrays;
    import java.util.Comparator;
    
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.Environment;
    import android.os.StatFs;
    import android.util.Log;
    
    /**
     * 图片文件保存、读写类
     * @author Barry
     */
    public class FileOperationUtil {
    	private static final String TAG = "FileOperationUtil";
        private static final String CACHE_DIRECTORY = "TqProCache";
                                                                
        private static final int MB = 1024*1024;
        private static final int MAX_CACHE_SIZE = 10 * MB;
        private static final int LEAST_SIZE_OF_SDCARD = 10 * MB;
        
        /** 从缓存中获取图片 **/
        public static Bitmap getImage(final String imageUrl) {   
            final String path = getCacheDirectory() + "/" + convertUrlToFileName(imageUrl);
           // Log.i(TAG, "getImage filepath:" + path);
           // Log.i(TAG, "getImage url:" + url);
            File file = new File(path);
            if (file.exists()) {
    //        	Log.i(TAG, "getImage file exists");
            	Bitmap bmp = null;
            	try {
            		//宽变为原图的1/3。高也变为原图的1/3。这样是为了减少内存的消耗,防止内存溢出
            		BitmapFactory.Options options=new BitmapFactory.Options(); 
            		options.inSampleSize = 3; 
            		bmp = BitmapFactory.decodeFile(path,options);
            		LogUtil.d(TAG, "bmp size="+bmp.getByteCount());
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
                if (bmp == null) {
                    file.delete();
                } else {
                	updateFileTime(path);
                    return bmp;
                }
            }
            return null;
        }
                                                                    
        /** 将图片存入文件缓存 **/
        public static void saveBitmap(String imageUrl, Bitmap bm ) {
            if (bm == null) {
                return;
            }
            //推断sdcard上的空间
            if (getFreeSpaceOfSdcard() < LEAST_SIZE_OF_SDCARD) {
                //SD空间不足
                return;
            }
            String filename = convertUrlToFileName(imageUrl);
            String dir = getCacheDirectory();
            File dirFile = new File(dir);
            if (!dirFile.exists()){
            	if(!dirFile.mkdirs()){
            		Log.w(TAG, "create cache file directorys failed");
            	}
            }
            File file = new File(dir +"/" + filename);
            try {
                file.createNewFile();
                OutputStream outStream = new FileOutputStream(file);
                bm.compress(Bitmap.CompressFormat.JPEG, 100, outStream);
                outStream.flush();
                outStream.close();
            } catch (FileNotFoundException e) {
                Log.w(TAG, "FileNotFoundException");
            } catch (IOException e) {
                Log.w(TAG, "IOException");
            }
        }
                                                                    
        /**
         * 计算存储文件夹下的文件大小,
         * 当文件总大小大于指定的MAX_CACHE_SIZE或者sdcard剩余空间小于指定的LEAST_SIZE_OF_SDCARD
         * 那么删除40%近期没有被使用的文件
         */
        public static boolean removeExtraCache() {
            File dir = new File(getCacheDirectory());
            File[] files = dir.listFiles();
            if (files == null) {
                return true;
            }
            if (!android.os.Environment.getExternalStorageState().equals(
                    android.os.Environment.MEDIA_MOUNTED)) {
                return false;
            }
                                                                
            int dirSize = 0;
            for (int i = 0; i < files.length; i++) {
            	dirSize += files[i].length();
            }
    //        LogUtil.d("Barry", "dirSize="+dirSize);
                                                                
            if (dirSize > MAX_CACHE_SIZE || getFreeSpaceOfSdcard() < LEAST_SIZE_OF_SDCARD) {
                int removeNum = (int) ((0.4 * files.length) + 1);
                /* 依据文件的最后改动时间进行升序排序 */
                Arrays.sort(files, new Comparator<File>() {
                	@Override
                	 public int compare(File file1, File file2) {
                         if (file1.lastModified() > file2.lastModified()) {
                             return 1;
                         } else if (file1.lastModified() == file2.lastModified()) {
                             return 0;
                         } else {
                             return -1;
                         }
                     }
    			});
               /* for (int i = 0; i < files.length; i++) {
                	LogUtil.d("Barry", "file.modifiedTime="+files[i].lastModified());
    			}*/
                for (int i = 0; i < removeNum; i++) {
                	files[i].delete();
                }
                return true;
            }else{
            	return false;
            }
        }
                                                                    
        /** 改动文件的最后改动时间 **/
        public static void updateFileTime(String path) {
            File file = new File(path);
            long newModifiedTime = System.currentTimeMillis();
            file.setLastModified(newModifiedTime);
        }
                                                                    
        /** 计算sdcard上的剩余空间 **/
        private static int getFreeSpaceOfSdcard() {
            StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
            double sdFreeSize = ((double)stat.getAvailableBlocks() * (double) stat.getBlockSize());
            return (int) sdFreeSize;
        }
                                                                    
        private static String convertUrlToFileName(String url) {
            String[] strs = url.split("/");
            String savedImageName = strs[strs.length - 1];
            return savedImageName;
        }
                                                                    
        /** 获得缓存文件夹 **/
        private static String getCacheDirectory() {
            String dir = getSDPath() + "/" + CACHE_DIRECTORY;
            return dir;
        }
                                                                    
        /** 获取SD卡路径 **/
        private static String getSDPath() {
            String sdcardPath = null;
            boolean sdCardExist = Environment.getExternalStorageState().equals(
                    android.os.Environment.MEDIA_MOUNTED);  //推断sd卡是否存在
            if (sdCardExist) {
                sdcardPath = Environment.getExternalStorageDirectory().getAbsolutePath();  //获取根文件夹
            }
            if (sdcardPath != null) {
                return sdcardPath;
            } else {
                return "";
            }
        }
    }
    


    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    python float保留两位小数
    linux使用ftp服务
    selenium是如何启动浏览器的
    小白学PYTHON时最容易犯的6个错误,看看你遇到过几个
    为什么你需要测试某个字段为空的场景
    为什么要做接口测试
    从爱奇艺招聘信息看当前测试开发的技能要求
    测试同学难道要写一辈子的hello world?
    收藏清单: python测试框架最全资源汇总
    如何写出测不出bug的测试用例
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4642169.html
Copyright © 2011-2022 走看看