`

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-support-v4和glide-3.6.1.rar

    其次,Glide库是一个强大的Android图像加载库,主要用于加载和显示网络、本地存储或其他来源的图像。Glide以高效、流畅的方式管理内存和磁盘缓存,确保图片加载快速且不会引起内存泄漏。在版本3.6.1中,Glide提供了...

    Android-SD卡文件夹创建和删除实现

    在Android系统中,与SD卡交互是常见的操作,特别是在存储用户数据或应用资源时。本文将深入探讨如何在Android中创建和删除SD卡上的文件夹,以及如何利用ListView和BaseAdapter来显示这些文件夹信息。 首先,让我们...

    Android-NS-USBloader移动版是原始NS-USBloader的Android实现

    NS-USBloader最初是一个用于任天堂Switch的Homebrew应用,允许用户通过USB存储设备而非内置存储或microSD卡来运行游戏。这样不仅节省了主机的内部存储空间,也为那些需要更大游戏库但受制于存储容量的用户提供了便利...

    Android-Universal-Image-Loader

    它支持从网络、SD卡、本地资源或应用资源等多种来源加载图片,并且具备图片的缓存机制,包括内存缓存和磁盘缓存,有效减少了网络请求,提高了用户体验。此外,UIL还提供了图片的显示策略,如根据网络状态选择加载...

    Android-Android扫描SD卡指定类型文件

    1. **读写权限**:从Android 6.0(API级别23)开始,系统采用了运行时权限管理,应用程序需要在运行时请求读取外部存储(如SD卡)的权限。在AndroidManifest.xml中添加`&lt;uses-permission android:name="android....

    android SD卡操作工具类

    android SD卡操作的工具类的源码

    Android-Universal-Image-Loader Library和Demo

    - **磁盘缓存策略**:通过在SD卡或内部存储创建一个文件缓存,提高图片的加载速度。 - **图片占位符与错误图片**:在图片加载过程中可以显示占位符图片,加载失败时可显示错误图片。 - **图片变形与缩放**:支持多种...

    Android--开发--Gallery从SD卡中获取图片,并显示.rar

    在Android中,访问外部存储(如SD卡)需要在`AndroidManifest.xml`文件中声明`READ_EXTERNAL_STORAGE`权限。从Android 6.0(API级别23)开始,还需要在运行时请求权限。 ```xml &lt;uses-permission android:name=...

    Android-针对第三方SDK乱改存储卡和读取用户数据等行为利用反射方式重定向SD卡目录。

    在Java和Android中,反射是一种运行时检查和操作类、接口、字段和方法的能力。通过反射,我们可以动态地获取类的信息并调用其方法,即使这些方法在编译时是未知的。这为我们提供了一种灵活的方式来处理第三方SDK的...

    android---在内部存储中读写文件

    相比于外部存储(SD卡),内部存储具有以下优势: 1. 安全性:内部存储的数据仅限于应用自身访问,提供了一定的数据保护。 2. 隐私性:用户无法直接查看或修改内部存储的内容,除非卸载或root设备。 3. 持久性:即使...

    Android-Universal-Image-Loader-master

    3. **硬盘缓存**:将图片保存在SD卡中,下次加载时可直接从本地读取,提高加载速度。 4. **图片占位符与错误图片**:在图片加载过程中可以设置占位符图片,加载失败时可以显示错误图片,提升用户体验。 5. **图片...

    android-se-access-master

    在Android系统中,Secure Element(SE)是一种安全芯片,用于存储敏感数据,如信用卡信息、数字证书等。它提供了一种硬件级别的安全保障,确保数据在处理时不会被未授权的访问。"android-se-access-master"项目是...

    Android-API-3.rar_android_android api

    8. **Android权限**:每个Android应用都有自己的沙盒环境,要访问特定系统功能(如读写SD卡、访问GPS等)需要在AndroidManifest.xml中声明相应的权限。 9. **SQLite数据库**:Android内置的关系型数据库系统,用于...

    Android高级应用源码-android-flip 类似Flipboard翻转动画的实现.zip

    在Android中,可以通过`Matrix`类来操作图像变换。`Matrix`可以执行缩放、旋转、平移等多种变换,实现复杂的图形效果。在`FlipImageView`中,翻转动画的实现就依赖于对`Matrix`对象的操作。 3. **动画框架**: ...

    Android 获取内外置存储卡

    在Android系统中,管理和操作存储卡(内外置)是应用程序扩展存储能力的重要一环。本文将深入探讨如何在Android平台上获取内外置存储卡的相关信息,包括路径、判断其是否存在以及如何加载SD卡。 首先,我们要了解...

    qiantaojiaoyu-Tinder-Android-简易mvp架构.zip

    在Android应用开发中,Model-View-Presenter(MVP)架构是一种常见的设计模式,它将应用程序的业务逻辑、用户界面和数据处理分离,以提高代码的可读性、可维护性和测试性。在这个名为"qiantaojiaoyu-Tinder-Android-...

    android-NFC 读取银行卡 visa 等国外银行卡源码demo

    本示例"android-NFC 读取银行卡 visa 等国外银行卡源码demo"是针对如何利用Android NFC功能读取包括Visa在内的国际银行卡信息的一个实际操作演示。通过分析这个源码,我们可以深入理解Android NFC API的使用方法以及...

    siwangqishiq-ImageEditor-Android-cd6d62b.zip_Android滤镜_ImageEdit

    这涉及到Android的Camera API或Camera2 API的使用,通过申请权限、配置相机参数、捕获图像并将其保存到内存或存储卡,最后传入编辑界面进行处理。 总结来说,"siwangqishiq-ImageEditor-Android-cd6d62b"是一款集成...

    Android开发:SD卡操作的工具类

    本工具类,主要用于操作SD卡,主要功能:判断手机SD卡是否挂载;获取SD卡的绝对物理路径;将数据保存到SD卡;读取SD卡中的文件

    中关村黑马程序员训练营android-4.0视频下载地址

    - **内容介绍**:讲解了Android中文件系统的基本概念,包括如何读写文件、如何使用内部存储和外部存储(如SD卡)等。 #### 17. 外部存储权限 - **视频链接**:http://www.400gb.com/file/85659765 - **内容介绍**:...

Global site tag (gtag.js) - Google Analytics