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. opencv-形态处理

    开运算 (Opening) 原理摘自:http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/opening_closi ...

  2. hosts目录位置

    C:\WINDOWS\system32\drivers\etc 版权声明:本文博客原创文章,博客,未经同意,不得转载.

  3. Akka 简介与入门

    Akka 简介与入门 http://www.thinksaas.cn/group/topic/344095/ 参考官网  http://akka.io/ 开源代码  https://github.co ...

  4. 浅析pinyin4j源码 简单利用pinyin4j对中文字符进行自然排序(转)

    pinyin4j项目  官网地址 http://pinyin4j.sourceforge.net/ 我们先把资源下载下来,连同源码和jar包一起放入工程.如下图: 接下来在demo包下,我们写一个测试 ...

  5. 基于hadoop的电影推荐结果可视化

    数据可视化 1.数据的分析与统计 使用sql语句进行查询,获取所有数据的概述,包括电影数.电影类别数.人数.职业种类.点评数等. 2.构建数据可视化框架 这里使用了前端框架Bootstrap进行前端的 ...

  6. 在.NET Fiddle有趣的沙盒代码

    在.NET Fiddle有趣的沙盒代码 笔者:Tony Patton | 托尼·巴顿译:PurpleEndurer,2014-11-18,第1版 C#和VB.NET开发者能够使用.NET Fiddle ...

  7. 【安德鲁斯】于java代码集drawableLeft给予适当的大小如何,当?

    textView.setCompoundDrawables(drawable, null, null, null);如果看不到图片,这是由于需要手动定drawable适当的大小,使用drawable. ...

  8. Flux demo

    Flux demo Introduction flux应用架构如下图所示,本文并不是讲述怎么立即做一个酷炫的应用,而是讲述如何依照这种框架,来进行代码的组织.我们先把这个流程转述为文字:抛开与webA ...

  9. System.BadImageFormatException: 试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)

    原文 System.BadImageFormatException: 试图加载格式不正确的程序. (异常来自 HRESULT:0x8007000B) 用C#调用DLL文件,运行后报错如下: Syste ...

  10. 于ios7在遇到一些发展deprecated问题

    cell.textLabel.textAlignment = UITextAlignmentCenter; 现在我想写cell.textLabel.textAlignment =NSTextAlign ...