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 "";        }    }}


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

更多相关文章

  1. Android(安卓)获取当前日期 时间
  2. 【Android】安卓中常用的图片加载方法
  3. android圆形进度条ProgressBar颜色设置
  4. Android(安卓)service
  5. 【翻译】(1)Android(安卓)NDK Overview
  6. No 122 · android获取本机号码和本机唯一标识
  7. Android编译过程详解(二)
  8. android studio 打包 so 库
  9. Android基于Google map V2地图开发基础

随机推荐

  1. android图片放大 缩小 旋转
  2. Layout1.9
  3. Android usb 驱动
  4. Android 查看本机外网IP
  5. AndroidMenifest.xml(Android清单文件)内
  6. Android调用摄像头闪退
  7. Android官方资料--A/B System Updates
  8. c#开发android时layout.axml没有智能提示
  9. 解读ExpandableListView源码样式
  10. 初探 Ubuntu下android NDK