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

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

android文件缓存,并SD卡创建目录未能解决和bitmap内存溢出解决的更多相关文章

  1. Android 下载文件及写入SD卡

    Android 下载文件及写入SD卡,实例代码 <?xml version="1.0" encoding="utf-8"?> <LinearL ...

  2. Android 将文件保存到SD卡中

    ①写文件到sd卡中需要获得权限,在AndroidManifest.xml中添加如下权限: <uses-permission android:name="android.permissi ...

  3. [置顶] Android学习系列-把文件保存到SD卡上面(6)

    Android学习系列-把文件保存到SD卡上面(5) 一般多媒体文件,大文件需要保存到SD卡中.关键点如下: 1,SD卡保存目录:mnt/sdcard,一般采用Environment.getExter ...

  4. assets下的文件复制到SD卡

    由于assets和res下的文件都只可以读不可以写,那么在程序初始化后,将后期需要使用并且需要修改的文件复制到SD卡.下面代码提供一个工具类,将assets下的任意资源复制到SD卡下. assets下 ...

  5. android复制数据库到SD卡(网上搜集,未经验证)

    android中使用sqlite.复制assets下的数据库到SD卡.支持大于1M的文件 如果使用SD卡,需要在AndroidManifest.xml中设置权限 <uses-permission ...

  6. asserts文件存到外部SD卡里

    package com.example.wang.testapp3; import android.content.res.AssetManager; import android.graphics. ...

  7. Android数据存储之SD卡

    为了更好的存取应用程序的大文件数据,应用程序需要读. 写SD卡上的文件.SD卡大大扩充手机的存储能力. 操作SD首先要加权限: <!--在SDCard中创建与删除文件权限 --> < ...

  8. Android中播放本地SD卡中歌曲须要的加入的权限

    使用MediaPlayer播放本地Mp3文件时.须要注意的訪问路径的问题以及訪问权限的问题. 1.訪问路径:/storage/emulated/0 此路径即为手机的根路径,能够通过下载ES文件浏览器软 ...

  9. Android之外部存储(SD卡)

    *手机的外部存储空间,这个我们可以理解成电脑的外接移动硬盘,U盘也行.所有的Android设备都有两个文件存储区域:“内部”和“外部”存储器.这两个名称来自早期的Android,当时大多数设备都提供内 ...

随机推荐

  1. java 生产者消费者问题 并发问题的解决(转)

    引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 ...

  2. mvc与My97DatePicker插件的结合

    Razor视图引擎与My97DatePicker插件的结合 1 using System; 2 using System.Collections.Generic; 3 using System.Run ...

  3. Android读取JSON格式数据

    Android读取JSON格式数据 1. 何为JSON? JSON,全称为JavaScript Object Notation,意为JavaScript对象表示法. JSON 是轻量级的文本数据交换格 ...

  4. Https 客户端与服务器交互过程梳理(转)

    本文试图以通俗易通的方式介绍Https的工作原理,不纠结具体的术语,不考证严格的流程.我相信弄懂了原理之后,到了具体操作和实现的时候,方向就不会错,然后条条大路通罗马.阅读文本需要提前大致了解对称加密 ...

  5. 探寻宝藏(双向DP)

    题目描述 传说HMH大沙漠中有一个M*N迷宫,里面藏有许多宝物.某天,Dr.Kong找到了迷宫的地图,他发现迷宫内处处有宝物,最珍贵的宝物就藏在右下角,迷宫的进出口在左上角.当然,迷宫中的通路不是平坦 ...

  6. scala 101

    * scala 安装: 下载可以执行的文件. 注意版本.  spark 0.8.0 对应的scala 为2.9.3 * scala 编译: 和java 很像: 1,  直接编译脚本: scalac H ...

  7. CSDN博文“待定”如何避免检测规则分析“待定”

    这些天一直很郁闷.鲍文本人一直"待定", 当然,这是非常不舒服的自己.那么今晚最终成为一个非成功出版"待定"文章,这CSDN于大家的反映而放弃了.没想到我后面又 ...

  8. Codeforces Round #272 (Div. 1)D(字符串DP)

    D. Dreamoon and Binary time limit per test 2 seconds memory limit per test 512 megabytes input stand ...

  9. 重写ArcGIS的TiledMapServiceLayer呼叫世界地图图块

    require(["esri/layers/TiledMapServiceLayer"], function () {     dojo.declare("com.Str ...

  10. js中prototype用法(转)

    JavaScript能够实现的面向对象的特征有:·公有属性(public field)·公有方法(public Method)·私有属性(private field)·私有方法(private fie ...