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. POJ3617 Best Cow Line 馋

    虽然这个问题很简单,但非常好,由于过程是很不错的.发展思路的比较 并鼓励人们,不像有些贪心太偏,推动穷人,但恼人 鉴于长N弦S,然后又空字符串STR.每当有两个选择 1:删S增加虚假的第一要素STR于 ...

  2. SQL SERVER 内存分配及常见内存问题(1)——简介

    原文:SQL SERVER 内存分配及常见内存问题(1)--简介 一.问题: 1.SQL Server 所占用内存数量从启动以后就不断地增加: 首先,作为成熟的产品,内存溢出的机会微乎其微.对此要了解 ...

  3. Struts2_1_struts2建立一个执行环境

    1)最低需要进口jar包: commons-fileupload-1.2.1.jar.commons-logging-1.0.4.jar. freemarker-2.3.15.jar.ognl-2.7 ...

  4. Redis源代码-数据结构Adlist双端列表

    Redis的Adlist实现了数据结构中的双端链表,整个结构例如以下: 链表节点定义: typedef struct listNode { struct listNode *prev; struct ...

  5. java.lang.Runnable接口

    大家都知道使用线程的2种方式,一是继承Thread类,二是实现Runnable接口.实际上,即使你实现了Runnable接口,终于还是要构造一个Thread类的对象.看过Thread源码发现,事实上这 ...

  6. 脚本+批处理打造IIS监控器

    原文 脚本+批处理打造IIS监控器 首先说下我什么要写它,第一.它可以帮你做一件事,那就是随时给你监控你公司的网站服务器的状态,一旦你的网站出现问题不能访问了,它就会自动帮你重启IIS然后让死掉的网站 ...

  7. 设计模式C++实现_1_Singleton设计模式(简单的实现)

    Singleton设计模式 思路如以下: Single.h #pragma once #include <iostream> #include <string> using n ...

  8. android static达到Service与Activity于Handler沟通

    供static理解力,仅适用于static理解力,不喜勿喷 第一种方式:离Service中获取Activity的static变量,调用该静态变量的getHandler()获取Handler进行发送消息 ...

  9. 使用 CodeIgniter 框架快速开发 PHP 应用(六)

    原文:使用 CodeIgniter 框架快速开发 PHP 应用(六) 简化使用 Session 和安全理论说得够多了! 现在让我们开始写我们自己的应用. 在这一章里,我们将会大致描述一下我们要建立的一 ...

  10. NYNU_省赛选拔题(5)

    题目描述 P 的一家要出去旅游,买了当地的地图,发现各地分别由各个景点,若 P 想使家人分队去景点,尽快到达各个景点(必须所有景点),并且最终所有家人都到达 M 所在的景点.   你用程序告诉 P 最 ...