android---------SD卡操作类

package com.amaker.util;



import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.SoftReference;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Environment;
import android.os.StatFs;

/**
 * Picture SD Util
 * 
 * @author BlackTiger
 * @version 1.0
 */
public class PictureSDUtil {
	private Context mContext;
	private static boolean ishasSD;
	private Bitmap bitmap;
	private Drawable defaultDrawable;
	private HashMap<String, SoftReference<Drawable>> imageCache;
	private final static String SD_PATH = Environment
			.getExternalStorageDirectory() + "/meilijie/imgs/";
	private final static String MYLIKE_SD_PATH = Environment
			.getExternalStorageDirectory() + "/meilijie/mylike/";
	private List<String> my_like_urls = new ArrayList<String>();
	// 图片保存的时间暂定为3天
	private long mTimeDiff = 864000000 * 3;

	/**
	 * 构造方法
	 * 
	 * @param mContext
	 */
	@SuppressWarnings("unused")
	public PictureSDUtil(Context context) {
		File file = new File(SD_PATH.toString());
		File file2 = new File(MYLIKE_SD_PATH.toString());
		this.mContext = context;
		imageCache = new HashMap<String, SoftReference<Drawable>>();
		defaultDrawable = mContext.getResources().getDrawable(R.drawable.icon);
	}

	/**
	 * 手机是否有内存卡的判断
	 * 
	 * @return ishasSD
	 */
	public boolean getSdcard() {
		ishasSD = Environment.getExternalStorageState().equals(
				Environment.MEDIA_MOUNTED);
		return ishasSD;
	}

	/**
	 * 获取SD卡剩余空间大小
	 * 
	 * @return freesdMB
	 */
	public static int freeSD() {
		StatFs sf = new StatFs(Environment.getExternalStorageDirectory()
				.getPath());
		double freesdMB = ((double) sf.getAvailableBlocks() * sf.getBlockSize())
				/ (1024 * 1024);
		return (int) freesdMB;
	}

	/**
	 * 判断图片是否存在于SD卡中
	 * 
	 * @return boolean
	 */
	public boolean isExist(String path) {
		String fileName = urlToFileName(path);
		File imgFile = new File(SD_PATH + fileName);
		if (imgFile.exists()) {
			if (imgFile.isFile()) {
				return true;
			}
		}
		return false;
	}

	/**
	 * 保存文件
	 * 
	 * @param bm
	 * @param fileName
	 * @throws IOException
	 */
	public Drawable saveFile(String path, Drawable drawable) {
		URL url;
		try {
			url = new URL(
					"http://tyy/login/hd_checknew.asp?v1=ch&v2=1&v3=LTRADER");
			URLConnection con;
			try {
				con = url.openConnection();
				con.setRequestProperty("User-Agent",
						"Mozilla/4.0 (compatible; MSIE 5.0; Win32)");
				con.connect();
			} catch (IOException e) {
				e.printStackTrace();
			}
		} catch (MalformedURLException e1) {
			e1.printStackTrace();
		}

		String fileName = urlToFileName(path);
		File myCaptureFile = new File(SD_PATH.toString() + fileName);
		Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
		ByteArrayOutputStream oaos = new ByteArrayOutputStream();
		bitmap.compress(CompressFormat.JPEG, 100, oaos);
		InputStream is = new ByteArrayInputStream(oaos.toByteArray());

		FileOutputStream fos = null;
		byte[] b = new byte[1024];
		int len = 0;
		try {
			fos = new FileOutputStream(myCaptureFile);
			while ((len = is.read(b)) != -1) {
				fos.write(b, 0, len);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();

			File file = new File(SD_PATH.toString());
			if (!file.exists()) {
				file.mkdirs();
			}

		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (fos != null) {
				try {
					fos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (is != null) {
				try {
					is.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return new BitmapDrawable(bitmap);

	}

	/**
	 * 读取文件
	 * 
	 * @param path
	 * @return Bitmap
	 */
	public Drawable loadImageFromUrl(String path) {
		InputStream in = null;
		Drawable drawable = null;
		Bitmap bitmap = null;
		// 第一;首先判断缓存中是否有这张图片,如果有,则取出
		if (imageCache.containsKey(path)) {
			SoftReference<Drawable> soft = imageCache.get(path);
			drawable = soft.get();
			if (drawable != null) {
				return drawable;
			}
		} else {
			// 第二;判断SD卡中是否有这张图片,如果没有,则下载,并放入缓存中。
			if (!isExist(path)) {
				try {
					in = new URL(path).openStream();
				} catch (MalformedURLException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}

				if (in == null) {
					return defaultDrawable;
				} else {
					try {
						drawable = Drawable.createFromStream(in, "src");
						if (drawable == null) {
							return defaultDrawable;
						} else {
							imageCache.put(path, new SoftReference<Drawable>(
									drawable));
							if (getSdcard() && freeSD() > 20) {
								// 保存图片到SD卡中
								saveFile(path, drawable);
							}
						}
s
					} catch (OutOfMemoryError out) {
						return defaultDrawable;
					} catch (Exception e) {
						return defaultDrawable;
					}
				}
				return drawable;
			} else {
				// 第三;如果SD卡中有这张图片,把这张图片放入缓存。
				BitmapFactory.Options options = new BitmapFactory.Options();
				options.inSampleSize = 1;
				options.inTempStorage = new byte[5 * 1024]; // 16MB的临时存储空间
				bitmap = BitmapFactory.decodeFile(SD_PATH.toString()
						+ urlToFileName(path), options);
				imageCache.put(path, new SoftReference<Drawable>(
						new BitmapDrawable(bitmap)));
				return new BitmapDrawable(bitmap);
			}
		}
		return null;

	}

	// 只从SD卡中读取文件,暂不关心缓存(瀑布流)
	public Drawable loadImageFromSD(String path) {
		InputStream in = null;
		Drawable drawable = null;
		Bitmap bitmap = null;
		if (!isExist(path)) {
			try {
				in = new URL(path).openStream();
			} catch (MalformedURLException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}

			if (in == null) {
				return defaultDrawable;
			} else {
				try {
					drawable = Drawable.createFromStream(in, "src");
					if (drawable == null) {
						return defaultDrawable;
					} else {
						if (getSdcard() && freeSD() > 20) {
							// 保存图片到SD卡中
							saveFile(path, drawable);
						}
					}

				} catch (OutOfMemoryError out) {
					return defaultDrawable;
				} catch (Exception e) {
					return defaultDrawable;
				}
			}
			return drawable;
		} else {
			// 第三;如果SD卡中有这张图片,把这张图片放入缓存。
			BitmapFactory.Options options = new BitmapFactory.Options();
			options.inSampleSize = 1;
			options.inTempStorage = new byte[5 * 1024]; // 16MB的临时存储空间
			bitmap = BitmapFactory.decodeFile(SD_PATH.toString()
					+ urlToFileName(path), options);
			return new BitmapDrawable(bitmap);
		}
	}

	// 从SD卡中读取我喜欢的图片的url:
	public List<String> getMyLikeFiles() {
		// 得到图片文件夹下所有的图片名
		File dd = new File(MYLIKE_SD_PATH);
		String[] fs = dd.list();
		my_like_urls = Arrays.asList(fs);
		return my_like_urls;
	}


	/**
	 * 文件的复制(从一个文件夹复制到新的文件夹)
	 * 
	 * @param sourceFile
	 *            源文件
	 * @param targetFile
	 *            目标文件
	 */
	// 复制文件
	public static void copyFile(String filename) throws IOException {
		// 新建文件输入流并对它进行缓冲
		FileInputStream input = new FileInputStream(SD_PATH + filename);
		BufferedInputStream inBuff = new BufferedInputStream(input);

		// 新建文件输出流并对它进行缓冲
		FileOutputStream output = new FileOutputStream(MYLIKE_SD_PATH
				+ filename);
		BufferedOutputStream outBuff = new BufferedOutputStream(output);

		// 缓冲数组
		byte[] b = new byte[1024 * 5];
		int len;
		while ((len = inBuff.read(b)) != -1) {
			outBuff.write(b, 0, len);
		}
		// 刷新此缓冲的输出流
		outBuff.flush();

		// 关闭流
		inBuff.close();
		outBuff.close();
		output.close();
		input.close();
	}

	/**
	 * 获取资源文件:
	 * 
	 * @param context
	 * @param resId
	 */
	public static Bitmap readBitmap(Context context, int resId) {
		BitmapFactory.Options opt = new BitmapFactory.Options();
		opt.inPreferredConfig = Bitmap.Config.RGB_565;
		opt.inPurgeable = true;
		opt.inInputShareable = true;
		// 获取资源图片
		InputStream is = context.getResources().openRawResource(resId);
		return BitmapFactory.decodeStream(is, null, opt);
	}

	/**
	 * 回收bitmap
	 * 
	 * @param bmp
 	 */
	public static void recycle(Bitmap bmp) {
		if (bmp != null && !bmp.isRecycled()) {
			bmp.recycle(); // 回收图片所占的内存
			System.gc(); // 提醒系统及时回收
		}
	}

	/**
	 * 截取url获取文件名
	 * 
	 * @param imageUrl
	 * @return fileName
	 */
	public String urlToFileName(String path) {
		String[] buffers = path.split("/");
		int count = buffers.length;
		String fileName = buffers[count - 1];
		return fileName;
	}

	/**
	 * 修改文件的最后修改时间
	 * 
	 * @param dir
	 * @param fileName
	 */
	public void updateFileTime(String dir, String fileName) {
		File file = new File(dir, fileName);
		long newModifiedTime = System.currentTimeMillis();
		file.setLastModified(newModifiedTime);
	}

	/**
	 * 删除过期文件 24小时 = 86 400 000 毫秒
	 * 
	 * @param dirPath
	 * @param filename
	 */
	public void removeExpiredCache(String dirPath, String filename) {
		File file = new File(dirPath, filename);
		if (System.currentTimeMillis() - file.lastModified() > mTimeDiff) {
			file.delete();
		}
	}

	/**
	 * Bitmap转Drawable
	 * 
	 * @param bitmap
	 * @return bitmapDrawable
	 */
	public Drawable putBitmapToDrawable(Bitmap bitmap) {
		BitmapDrawable bitmapDrawable = new BitmapDrawable(
				mContext.getResources(), bitmap);
		return bitmapDrawable;
	}

	/**
	 * Drawable转Bitmap
	 * 
	 * @param drawable
	 * @return bitmap
	 */
	public Bitmap putDrawableToBitmap(Drawable drawable) {
		BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
		Bitmap bitmap = bitmapDrawable.getBitmap();
		return bitmap;
	}

	/**
	 * 获取图片的路径
	 * 
	 * @param drawable
	 * @return bitmap
	 */
	public String getSdPicturePath() {
		return SD_PATH;
	}

	public String getMyLikeSdPath() {
		return MYLIKE_SD_PATH;
	}

}

猜你喜欢

转载自android-zhang.iteye.com/blog/1637184