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---------SD卡操作类
猜你喜欢
转载自android-zhang.iteye.com/blog/1637184
今日推荐
周排行