package com.ydl.ydlcommon.utils; import android.annotation.SuppressLint; import android.app.Activity; import android.content.ActivityNotFoundException; import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.net.Uri; import android.os.Build; import android.os.Environment; import android.provider.DocumentsContract; import android.provider.MediaStore; import android.support.v4.content.FileProvider; import android.util.Log; 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; /** * 文件保存 * * @author xiongyu */ public class FileUtils { private static final String TAG = "FileUtils"; /** * sd卡的根目录 */ private static String mSdRootPath = Environment.getExternalStorageDirectory().getPath(); /** * 手机的缓存根目录 */ private static String mDataRootPath = null; /** * 保存Image的目录名 */ private final static String FOLDER_NAME = "/yidianling"; private static Context mContext; public FileUtils(Context context) { mDataRootPath = context.getCacheDir().getPath(); mContext = context; } /** * 获取储存Image的目录 * * @return */ public static String getStorageDirectory() { return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) ? mSdRootPath + FOLDER_NAME : mDataRootPath + FOLDER_NAME; } /** * 获取SD卡目录 * * @return */ public static String getSDDirectory() { return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) ? mSdRootPath : mDataRootPath; } public File SaveBitmap(Bitmap mBitmap, String path) throws IOException { File file; isFilleExit(path); File f = new File(path); try { f.createNewFile(); } catch (IOException e) { e.printStackTrace(); } FileOutputStream fOut = null; try { fOut = new FileOutputStream(f); } catch (FileNotFoundException e) { e.printStackTrace(); } mBitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut); fOut.flush(); fOut.close(); file=new File(path); return file; } public void SaveBitmap(Bitmap mBitmap, String path, String filen_name) throws IOException { isFilleExit(path); File f = new File(path + filen_name); try { f.createNewFile(); } catch (IOException e) { e.printStackTrace(); } FileOutputStream fOut = null; try { fOut = new FileOutputStream(f); } catch (FileNotFoundException e) { e.printStackTrace(); } mBitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut); fOut.flush(); fOut.close(); } /** * 从手机或者sd卡获取Bitmap * * @param fileName * @return */ public Bitmap getBitmap(String fileName) { return BitmapFactory.decodeFile(getStorageDirectory() + File.separator + fileName); } /** * 判断文件是否存在 * * @param fileName * @return */ public boolean isFileExists(String fileName) { return new File(getStorageDirectory() + File.separator + fileName).exists(); } /** * 获取文件的大小 * * @param fileName * @return */ public long getFileSize(String fileName) { return new File(getStorageDirectory() + File.separator + fileName).length(); } /** * 删除SD卡或者手机的缓存图片和目录 */ public void deleteFile() { File dirFile = new File(getStorageDirectory()); if (!dirFile.exists()) { return; } if (dirFile.isDirectory()) { String[] children = dirFile.list(); for (int i = 0; i < children.length; i++) { new File(dirFile, children[i]).delete(); } } dirFile.delete(); } /** * 判断该路径的文件是否存在 * * @param path * @return */ public static boolean isFilleExit(String path) { Boolean isexit = false; File f = new File(path); if (f.exists()) { isexit = true; } else { isexit = false; if (!f.exists()) { try { f.mkdirs(); } catch (Exception e) { e.printStackTrace(); } } } return isexit; } /** * 删除该目录下所有文件 * @param root */ public void deleteAllFiles(File root) { File files[] = root.listFiles(); if (files != null) for (File f : files) { if (f.isDirectory()) { // 判断是否为文件夹 deleteAllFiles(f); try { f.delete(); } catch (Exception e) { } } else { if (f.exists()) { // 判断是否存在 deleteAllFiles(f); try { f.delete(); } catch (Exception e) { } } } } } /** * File TO Uri * @param context * @param imageFile * @return */ public Uri getImageContentUri(Context context, File imageFile) { String filePath = imageFile.getAbsolutePath(); Cursor cursor = context.getContentResolver().query( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[] { MediaStore.Images.Media._ID }, MediaStore.Images.Media.DATA + "=? ", new String[] { filePath }, null); if (cursor != null && cursor.moveToFirst()) { int id = cursor.getInt(cursor .getColumnIndex(MediaStore.MediaColumns._ID)); Uri baseUri = Uri.parse("content://media/external/images/media"); return Uri.withAppendedPath(baseUri, "" + id); } else { if (imageFile.exists()) { ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.DATA, filePath); return context.getContentResolver().insert( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); } else { return null; } } } /** * 打开文件 * 兼容7.0 * * @param context activity * @param file File * @param contentType 文件类型如:文本(text/html) * 当手机中没有一个app可以打开file时会抛ActivityNotFoundException */ public static void startActionFile(Context context, File file, String contentType) throws ActivityNotFoundException { if (context == null) { return; } Intent intent = new Intent(Intent.ACTION_VIEW); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);//增加读写权限 intent.setDataAndType(getUriForFile(context, file), contentType); if (!(context instanceof Activity)) { intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); } context.startActivity(intent); } /** * 打开相机 * 兼容7.0 * * @param activity Activity * @param file File * @param requestCode result requestCode */ public static void startActionCapture(Activity activity, File file, int requestCode) { if (activity == null) { return; } Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, getUriForFile(activity, file)); activity.startActivityForResult(intent, requestCode); } public static Uri getUriForFile(Context context, File file) { if (context == null || file == null) { throw new NullPointerException(); } Uri uri; if (Build.VERSION.SDK_INT >= 24) { uri = FileProvider.getUriForFile(context.getApplicationContext(), "com.honjane.providerdemo.fileprovider", file); } else { uri = Uri.fromFile(file); } return uri; } /** * 图片的缩放方法 * * @param bitmap:源图片资源 * @param maxSize: 图片允许最大空间 单位 * :KB * @return */ public static Bitmap getZoomImage(Bitmap bitmap, double maxSize) { if (null == bitmap) { return null; } if (bitmap.isRecycled()) { return null; } // 单位:从 Byte 换算成 KB double currentSize = bitmapToByteArray(bitmap, false).length / 1024; // 判断bitmap占用空间是否大于允许最大空间,如果大于则压缩,小于则不压缩 while (currentSize > maxSize) { // 计算bitmap的大小是maxSize的多少倍 double multiple = currentSize / maxSize; // 开始压缩:将宽带和高度压缩掉对应的平方根倍 // 1.保持新的宽度和高度,与bitmap原来的宽高比率一致 // 2.压缩后达到了最大大小对应的新bitmap,显示效果最好 bitmap = getZoomImage(bitmap, bitmap.getWidth() / Math.sqrt(multiple), bitmap.getHeight() / Math.sqrt(multiple)); currentSize = bitmapToByteArray(bitmap, false).length / 1024; } return bitmap; } /** * bitmap转换成byte数组 * * @param bitmap * @param needRecycle * @return */ public static byte[] bitmapToByteArray(Bitmap bitmap, boolean needRecycle) { if (null == bitmap) { return null; } if (bitmap.isRecycled()) { return null; } ByteArrayOutputStream output = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, output); if (needRecycle) { bitmap.recycle(); } byte[] result = output.toByteArray(); try { output.close(); } catch (Exception e) { Log.e("xyutest", e.toString()); } return result; } /** * 图片的缩放方法 * * @param orgBitmap :源图片资源 * @param newWidth :缩放后宽度 * @param newHeight :缩放后高度 * @return */ public static Bitmap getZoomImage(Bitmap orgBitmap, double newWidth, double newHeight) { if (null == orgBitmap) { return null; } if (orgBitmap.isRecycled()) { return null; } if (newWidth <= 0 || newHeight <= 0) { return null; } // 获取图片的宽和高 float width = orgBitmap.getWidth(); float height = orgBitmap.getHeight(); // 创建操作图片的matrix对象 Matrix matrix = new Matrix(); // 计算宽高缩放率 float scaleWidth = ((float) newWidth) / width; float scaleHeight = ((float) newHeight) / height; // 缩放图片动作 matrix.postScale(scaleWidth, scaleHeight); Bitmap bitmap = Bitmap.createBitmap(orgBitmap, 0, 0, (int) width, (int) height, matrix, true); return bitmap; } /** * 通过uri获取绝对路径 * @param context * @param uri * @return */ @SuppressLint("NewApi") public static String getPathByUri4kitkat(final Context context, final Uri uri) { final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; // DocumentProvider if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { if (Utils.isExternalStorageDocument(uri)) {// ExternalStorageProvider final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; if ("primary".equalsIgnoreCase(type)) { return Environment.getExternalStorageDirectory() + "/" + split[1]; } } else if (Utils.isDownloadsDocument(uri)) {// DownloadsProvider final String id = DocumentsContract.getDocumentId(uri); final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); return Utils.getDataColumn(context, contentUri, null, null); } else if (Utils.isMediaDocument(uri)) {// MediaProvider final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; Uri contentUri = null; if ("image".equals(type)) { contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; } else if ("video".equals(type)) { contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; } else if ("audio".equals(type)) { contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; } final String selection = "_id=?"; final String[] selectionArgs = new String[] { split[1] }; return Utils.getDataColumn(context, contentUri, selection, selectionArgs); } } else if ("content".equalsIgnoreCase(uri.getScheme())) {// MediaStore // (and // general) return Utils.getDataColumn(context, uri, null, null); } else if ("file".equalsIgnoreCase(uri.getScheme())) {// File return uri.getPath(); } return null; } /** * 复制单个文件 * @param oldPath String 原文件路径 如:c:/fqf.txt * @param newPath String 复制后路径 如:f:/fqf.txt * @return boolean */ public static void copyFile(String oldPath, String newPath) throws Exception { int bytesum = 0; int byteread = 0; File oldfile = new File(oldPath); if (!oldfile.exists()) { //文件不存在时 InputStream inStream = new FileInputStream(oldPath); //读入原文件 FileOutputStream fs = new FileOutputStream(newPath); byte[] buffer = new byte[1444]; int length; while ( (byteread = inStream.read(buffer)) != -1) { bytesum += byteread; //字节数 文件大小 fs.write(buffer, 0, byteread); } inStream.close(); } } }