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;
}
}
分享到:
相关推荐
其次,Glide库是一个强大的Android图像加载库,主要用于加载和显示网络、本地存储或其他来源的图像。Glide以高效、流畅的方式管理内存和磁盘缓存,确保图片加载快速且不会引起内存泄漏。在版本3.6.1中,Glide提供了...
在Android系统中,与SD卡交互是常见的操作,特别是在存储用户数据或应用资源时。本文将深入探讨如何在Android中创建和删除SD卡上的文件夹,以及如何利用ListView和BaseAdapter来显示这些文件夹信息。 首先,让我们...
NS-USBloader最初是一个用于任天堂Switch的Homebrew应用,允许用户通过USB存储设备而非内置存储或microSD卡来运行游戏。这样不仅节省了主机的内部存储空间,也为那些需要更大游戏库但受制于存储容量的用户提供了便利...
它支持从网络、SD卡、本地资源或应用资源等多种来源加载图片,并且具备图片的缓存机制,包括内存缓存和磁盘缓存,有效减少了网络请求,提高了用户体验。此外,UIL还提供了图片的显示策略,如根据网络状态选择加载...
1. **读写权限**:从Android 6.0(API级别23)开始,系统采用了运行时权限管理,应用程序需要在运行时请求读取外部存储(如SD卡)的权限。在AndroidManifest.xml中添加`<uses-permission android:name="android....
android SD卡操作的工具类的源码
- **磁盘缓存策略**:通过在SD卡或内部存储创建一个文件缓存,提高图片的加载速度。 - **图片占位符与错误图片**:在图片加载过程中可以显示占位符图片,加载失败时可显示错误图片。 - **图片变形与缩放**:支持多种...
在Android中,访问外部存储(如SD卡)需要在`AndroidManifest.xml`文件中声明`READ_EXTERNAL_STORAGE`权限。从Android 6.0(API级别23)开始,还需要在运行时请求权限。 ```xml <uses-permission android:name=...
在Java和Android中,反射是一种运行时检查和操作类、接口、字段和方法的能力。通过反射,我们可以动态地获取类的信息并调用其方法,即使这些方法在编译时是未知的。这为我们提供了一种灵活的方式来处理第三方SDK的...
相比于外部存储(SD卡),内部存储具有以下优势: 1. 安全性:内部存储的数据仅限于应用自身访问,提供了一定的数据保护。 2. 隐私性:用户无法直接查看或修改内部存储的内容,除非卸载或root设备。 3. 持久性:即使...
3. **硬盘缓存**:将图片保存在SD卡中,下次加载时可直接从本地读取,提高加载速度。 4. **图片占位符与错误图片**:在图片加载过程中可以设置占位符图片,加载失败时可以显示错误图片,提升用户体验。 5. **图片...
在Android系统中,Secure Element(SE)是一种安全芯片,用于存储敏感数据,如信用卡信息、数字证书等。它提供了一种硬件级别的安全保障,确保数据在处理时不会被未授权的访问。"android-se-access-master"项目是...
8. **Android权限**:每个Android应用都有自己的沙盒环境,要访问特定系统功能(如读写SD卡、访问GPS等)需要在AndroidManifest.xml中声明相应的权限。 9. **SQLite数据库**:Android内置的关系型数据库系统,用于...
在Android中,可以通过`Matrix`类来操作图像变换。`Matrix`可以执行缩放、旋转、平移等多种变换,实现复杂的图形效果。在`FlipImageView`中,翻转动画的实现就依赖于对`Matrix`对象的操作。 3. **动画框架**: ...
在Android系统中,管理和操作存储卡(内外置)是应用程序扩展存储能力的重要一环。本文将深入探讨如何在Android平台上获取内外置存储卡的相关信息,包括路径、判断其是否存在以及如何加载SD卡。 首先,我们要了解...
在Android应用开发中,Model-View-Presenter(MVP)架构是一种常见的设计模式,它将应用程序的业务逻辑、用户界面和数据处理分离,以提高代码的可读性、可维护性和测试性。在这个名为"qiantaojiaoyu-Tinder-Android-...
本示例"android-NFC 读取银行卡 visa 等国外银行卡源码demo"是针对如何利用Android NFC功能读取包括Visa在内的国际银行卡信息的一个实际操作演示。通过分析这个源码,我们可以深入理解Android NFC API的使用方法以及...
这涉及到Android的Camera API或Camera2 API的使用,通过申请权限、配置相机参数、捕获图像并将其保存到内存或存储卡,最后传入编辑界面进行处理。 总结来说,"siwangqishiq-ImageEditor-Android-cd6d62b"是一款集成...
本工具类,主要用于操作SD卡,主要功能:判断手机SD卡是否挂载;获取SD卡的绝对物理路径;将数据保存到SD卡;读取SD卡中的文件
- **内容介绍**:讲解了Android中文件系统的基本概念,包括如何读写文件、如何使用内部存储和外部存储(如SD卡)等。 #### 17. 外部存储权限 - **视频链接**:http://www.400gb.com/file/85659765 - **内容介绍**:...