365 lines
9.7 KiB
Java
365 lines
9.7 KiB
Java
package com.example.nanchen.aiyaschoolpush.helper;
|
||
|
||
import android.content.Context;
|
||
import android.media.ExifInterface;
|
||
import android.os.Environment;
|
||
import android.os.StatFs;
|
||
|
||
import com.example.nanchen.aiyaschoolpush.App;
|
||
|
||
import java.io.File;
|
||
import java.io.FileInputStream;
|
||
import java.io.FileOutputStream;
|
||
import java.io.IOException;
|
||
import java.io.InputStream;
|
||
import java.text.SimpleDateFormat;
|
||
import java.util.Date;
|
||
|
||
/**
|
||
* 文件工具类
|
||
*
|
||
* @author Frank
|
||
* @email frank@mondol.info
|
||
* @create_date 2015-2
|
||
*/
|
||
public class FileHelper {
|
||
|
||
public static final String AUDIO = Environment.DIRECTORY_MUSIC;
|
||
public static final String IMAGE = Environment.DIRECTORY_PICTURES;
|
||
public static final String OTHER = Environment.DIRECTORY_PICTURES;
|
||
|
||
static boolean mExternalStorageAvailable = false;
|
||
static boolean mExternalStorageWriteable = false;
|
||
|
||
/**
|
||
* 检索当前系统是否包含扩展存储卡
|
||
*
|
||
* @return 0:没有存储卡|1:有只读存储卡|2:有可读写存储卡
|
||
*/
|
||
public static int hasExternalStorage() {
|
||
final String state = Environment.getExternalStorageState();
|
||
if (Environment.MEDIA_MOUNTED.equals(state)) {
|
||
// We can read and write the media
|
||
return 2;
|
||
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
|
||
return 1;
|
||
} else {
|
||
// 其它状态是错误的,即不能读也不能写
|
||
return 0;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 获取扩展存储卡剩余空间
|
||
*/
|
||
public static long getAvailableExternalStorageSize() {
|
||
if (2 == hasExternalStorage()) {
|
||
StatFs localStatFs = new StatFs(Environment.getExternalStorageDirectory().getPath());
|
||
|
||
long blockSize = localStatFs.getBlockSize();
|
||
long blockCount = localStatFs.getAvailableBlocks();
|
||
return blockSize * blockCount;
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
/**
|
||
* 复制一个文件
|
||
*/
|
||
public static int copyFile(String fromFile, String toFile) {
|
||
try {
|
||
InputStream fosfrom = new FileInputStream(fromFile);
|
||
FileOutputStream fosto = new FileOutputStream(toFile);
|
||
byte[] bys = new byte[4096];
|
||
int c;
|
||
while ((c = fosfrom.read(bys)) > 0) {
|
||
fosto.write(bys, 0, c);
|
||
}
|
||
fosfrom.close();
|
||
fosto.close();
|
||
return 0;
|
||
|
||
} catch (Exception ex) {
|
||
return -1;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 获取files目录,优先返回存储卡中的目录
|
||
*/
|
||
public static File getFilesDir() {
|
||
Context ctx = Environment2.getAppContext();
|
||
if (2 == hasExternalStorage()) {
|
||
return ctx.getExternalFilesDir(null);
|
||
} else {
|
||
return ctx.getFilesDir();
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 获取缓存路径(优先返回存储卡中的目录)
|
||
*/
|
||
public static File getCacheDir() {
|
||
Context ctx = Environment2.getAppContext();
|
||
if (2 == hasExternalStorage()) {
|
||
return ctx.getExternalCacheDir();
|
||
} else {
|
||
return ctx.getCacheDir();
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 返回指定目录中一个唯一的空文件
|
||
* <p/>
|
||
* 注:方法成功返回时文件已创建,用后请删除
|
||
*
|
||
* @param fDir 文件目录 如果为null则会在扩展存储卡中的CacheDir中生成文件
|
||
* 如果扩展存储卡不存在则在应用CacheDir中生成文件
|
||
* @param suffix 文件后缀 null则使用.tmp
|
||
* @return 返回则返回null
|
||
*/
|
||
public static File createTempFile(File fDir, String suffix) {
|
||
Context context = Environment2.getAppContext();
|
||
if (fDir == null) {
|
||
if (2 == hasExternalStorage()) {
|
||
fDir = context.getExternalCacheDir();
|
||
} else {
|
||
fDir = context.getCacheDir();
|
||
}
|
||
}
|
||
|
||
SimpleDateFormat sdf = new SimpleDateFormat("yyMMddHH");
|
||
String prefix = sdf.format(new Date());
|
||
try {
|
||
return File.createTempFile(prefix, suffix, fDir);
|
||
} catch (IOException e) {
|
||
e.printStackTrace();
|
||
return null;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 获取一个空的临时文件
|
||
*
|
||
* @throws IOException
|
||
*/
|
||
public static File createTempFile(String suffix) {
|
||
return createTempFile(null, suffix);
|
||
}
|
||
|
||
/**
|
||
* 获取随机图片文件名
|
||
*
|
||
* @return
|
||
* @author Williams
|
||
*/
|
||
static public File getImageFilePath() {
|
||
String suffix = ".jpg";
|
||
File dir = getDirByType(IMAGE);
|
||
File file = getFile(suffix, dir);
|
||
return file;
|
||
}
|
||
|
||
/**
|
||
* 获取图片和音频外的文件名
|
||
*
|
||
* @return
|
||
* @author Williams
|
||
*/
|
||
static public File getOtherFilePath(String sufix) {
|
||
String suffix = "." + sufix;
|
||
File dir = getDirByType(OTHER);
|
||
File file = getFile(suffix, dir);
|
||
return file;
|
||
}
|
||
|
||
/**
|
||
* 获取音频随机文件名
|
||
*
|
||
* @return
|
||
* @author Williams
|
||
*/
|
||
static public File getAudioFilePath() {
|
||
String suffix = ".amr";
|
||
File dir = getDirByType(AUDIO);
|
||
File file = getFile(suffix, dir);
|
||
return file;
|
||
}
|
||
|
||
/**
|
||
* 获取音频随机文件名
|
||
*
|
||
* @return
|
||
* @author Williams
|
||
*/
|
||
public static File getFile(String suffix, File dir) {
|
||
if (dir == null) {
|
||
throw new NullPointerException("Dir can not be null!");
|
||
} else if (!dir.exists()) {
|
||
dir.mkdirs();
|
||
}
|
||
try {
|
||
return File.createTempFile("fx_temp_", suffix, dir);
|
||
} catch (IOException e) {
|
||
e.printStackTrace();
|
||
return null;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 获取图片文件扩展信息(方向)
|
||
*
|
||
* @return int 图片的旋转角度
|
||
* @author Williams
|
||
*/
|
||
public static int getExifOrientation(String filepath) {
|
||
int degree = 0;
|
||
ExifInterface exif = null;
|
||
try {
|
||
exif = new ExifInterface(filepath);
|
||
} catch (IOException ex) {
|
||
}
|
||
if (exif != null) {
|
||
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, -1);
|
||
if (orientation != -1) {
|
||
// We only recognize a subset of orientation tag values.
|
||
switch (orientation) {
|
||
case ExifInterface.ORIENTATION_ROTATE_90:
|
||
degree = 90;
|
||
break;
|
||
case ExifInterface.ORIENTATION_ROTATE_180:
|
||
degree = 180;
|
||
break;
|
||
case ExifInterface.ORIENTATION_ROTATE_270:
|
||
degree = 270;
|
||
break;
|
||
}
|
||
|
||
}
|
||
}
|
||
return degree;
|
||
}
|
||
|
||
/**
|
||
* 检测外部存储卡状态
|
||
*
|
||
* @return
|
||
* @author Williams
|
||
*/
|
||
private static void checkStorageState() {
|
||
final String state = Environment.getExternalStorageState();
|
||
|
||
if (Environment.MEDIA_MOUNTED.equals(state)) {
|
||
// 外部存储卡可读写
|
||
mExternalStorageAvailable = mExternalStorageWriteable = true;
|
||
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
|
||
// 外部存储卡只读
|
||
mExternalStorageAvailable = true;
|
||
mExternalStorageWriteable = false;
|
||
} else {
|
||
// 外部存储卡不可用
|
||
mExternalStorageAvailable = mExternalStorageWriteable = false;
|
||
}
|
||
}
|
||
|
||
private static Context getContext() {
|
||
return App.getAppContext().getApplicationContext();
|
||
}
|
||
|
||
/**
|
||
* 获取音频随机文件
|
||
*
|
||
* @return
|
||
* @author Williams
|
||
*/
|
||
public static File getAudioDir() {
|
||
return getDirByType(AUDIO);
|
||
}
|
||
|
||
/**
|
||
* 获取图片随机文件
|
||
*
|
||
* @return
|
||
* @author Williams
|
||
*/
|
||
public static File getImageDir() {
|
||
return getDirByType(IMAGE);
|
||
}
|
||
|
||
/**
|
||
* @return
|
||
* @author Williams
|
||
*/
|
||
static public File getDirByType(String typeName) {
|
||
checkStorageState();
|
||
final Context context = getContext();
|
||
if (mExternalStorageWriteable) {
|
||
return context.getExternalFilesDir(typeName);
|
||
} else {
|
||
return context.getCacheDir();
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @return
|
||
* @author WLF
|
||
*/
|
||
public static File getFileDir() {
|
||
checkStorageState();
|
||
final Context context = getContext();
|
||
if (mExternalStorageWriteable) {
|
||
return context.getExternalFilesDir(null);
|
||
} else {
|
||
return context.getCacheDir();
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 检测SD卡是否可写
|
||
*
|
||
* @return
|
||
* @author WLF
|
||
*/
|
||
public static boolean isSdcardWriteable() {
|
||
checkStorageState();
|
||
return mExternalStorageWriteable;
|
||
}
|
||
|
||
/**
|
||
* 检测文件是否可用
|
||
*
|
||
* @return
|
||
* @author WLF
|
||
*/
|
||
public static boolean checkFile(File f) {
|
||
if (f != null && f.exists() && f.canRead() && (f.isDirectory() || (f.isFile() && f.length() > 0))) {
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
/**
|
||
* 检测文件是否可用
|
||
*
|
||
* @return
|
||
* @author WLF
|
||
*/
|
||
public static boolean checkFile(String path) {
|
||
if (StringHelper.isNotEmpty(path)) {
|
||
File f = new File(path);
|
||
if (f != null && f.exists() && f.canRead() && (f.isDirectory() || (f.isFile() && f.length() > 0)))
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
public static boolean tryDeleteFile(File file) {
|
||
try {
|
||
file.delete();
|
||
return true;
|
||
} catch (Throwable t) {
|
||
return false;
|
||
}
|
||
}
|
||
}
|