package cn.alphabets.light.util; import android.content.ContentResolver; import android.content.ContentUris; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Build; import android.os.Environment; import android.provider.DocumentsContract; import android.provider.MediaStore; import com.android.volley.Request; 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.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.UUID; import cn.alphabets.light.R; import cn.alphabets.light.exception.NetworkException; import cn.alphabets.light.log.Logger; import cn.alphabets.light.network.ContextManager; import cn.alphabets.light.network.SessionManager; import cn.alphabets.light.network.VolleyManager; import cn.alphabets.light.setting.Default; import cn.alphabets.light.ui.Dialog; /** * 文件操作 * Created by lin on 14/12/4. */ public class FileUtil { /** * 保存图片文件 * * @param bitmap 图片 * @return 图片路径 * @throws IOException */ public static String saveBitmap(Bitmap bitmap) throws IOException { File file = getTemporaryFile(); FileOutputStream stream = new FileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.JPEG, Default.CompressQuality, stream); stream.close(); return file.getAbsolutePath(); } /** * 图像文件生成Bitmap实例 * * @param path 图像所在位置 * @return Bitmap实例 */ public static Bitmap loadBitmap(String path) { try { return BitmapFactory.decodeStream(new FileInputStream(new File(path))); } catch (FileNotFoundException e) { Logger.e(e); } return null; } public static Bitmap loadBitmap(int resource) { return BitmapFactory.decodeResource(ContextManager.getInstance().getResources(), resource); } /** * 获取调整大小后的图像 * * @param path 图像所在位置 * @param width 图像的宽度 * @return */ public static Bitmap loadScaledBitmap(String path, int width) { Bitmap bitmap = loadBitmap(path); if (bitmap == null) { return null; } int height = width * bitmap.getHeight() / bitmap.getWidth(); return Bitmap.createScaledBitmap(bitmap, width, height, false); } public static String scaledBitmap(String path, int width, boolean isFromCamera) { Bitmap bitmap = loadBitmap(path); // 如果是拍照获得的图片则删除原照 if (isFromCamera) { File originalFile = new File(path); if (originalFile.isFile()) { originalFile.delete(); } } if (bitmap == null) { return null; } float originalWidth = bitmap.getWidth(); float originalHeight = bitmap.getHeight(); float ratio = originalHeight / originalWidth; // 不管横屏竖屏,width都作为最小边 int height = (int) (width * ratio); if (ratio < 1) { height = width; width = (int) (height / ratio); } if (originalHeight > width || originalWidth > width) { bitmap = Bitmap.createScaledBitmap(bitmap, width, height, false); } try { return saveBitmap(bitmap); } catch (IOException e) { } return null; } /** * 获取临时文件 * * @return 临时文件路径 */ public static File getTemporaryFile() { return new File(getCacheDir(), UUID.randomUUID().toString()); } /** * 获取指定后缀的临时文件 * * @param fileEnding 包好.的后缀名如.txt * @return */ public static File getTemporaryFile(String fileEnding) { return new File(getCacheDir(), UUID.randomUUID().toString() + fileEnding); } /** * 获取临时目录 * * @return 目录 */ public static File getCacheDir() { String state = Environment.getExternalStorageState(); if (state.equals(Environment.MEDIA_MOUNTED) && !Environment.isExternalStorageRemovable()) { File dir = ContextManager.getInstance().getExternalCacheDir(); if (dir != null) { return dir; } } return ContextManager.getInstance().getCacheDir(); } /** * 获取工作目录 * 用户可通过清除数据,来清除这里的内容。 * 如果内容被清除,则程序不能正常运行时,不应该放在改目录下 * @return */ public static File getWorkDir() { String state = Environment.getExternalStorageState(); if (state.equals(Environment.MEDIA_MOUNTED) && !Environment.isExternalStorageRemovable()) { return ContextManager.getInstance().getExternalFilesDir(null); } return ContextManager.getInstance().getFilesDir(); } /** * 下载文件,因为是同步下载,建议使用AsyncTask * * @param url URL * @param file 下载的文件 * @throws NetworkException */ public static void downloadFile(String url, File file) throws NetworkException { try { if (url.toLowerCase().contains("http") || url.toLowerCase().contains("https")) { url = VolleyManager.getURL(url, Request.Method.GET, null); } else { url = VolleyManager.getURL(Default.UrlLoadFile + url, Request.Method.GET, null); } HttpURLConnection urlConnection = (HttpURLConnection) new URL(url).openConnection(); urlConnection.setRequestMethod("GET"); urlConnection.setRequestProperty(Default.CookieName, SessionManager.getCookie()); urlConnection.connect(); InputStream input = urlConnection.getInputStream(); byte[] buffer = new byte[1024]; int bufferLength; FileOutputStream output = new FileOutputStream(file); while ((bufferLength = input.read(buffer)) > 0) { output.write(buffer, 0, bufferLength); } output.close(); input.close(); } catch (Exception e) { Logger.e(e); throw new NetworkException(e.getMessage()); } } /** * 获取拍照所得图片的路径 * * @param uri * @param context * @return */ public static String getPhotoPath(Uri uri, Context context) { Cursor cursor = context.getContentResolver().query(uri, null, null, null, null); cursor.moveToFirst(); String path = cursor.getString(1); cursor.close(); return path; } /** * 获取图片库路径 * * @param uri url * @param context context * @return 路径 */ public static String getPhotoLibraryPath(Uri uri, Context context) { String[] projection = {MediaStore.Images.Media.DATA}; Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null); cursor.moveToFirst(); String path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA)); cursor.close(); if (path == null) { // some devices (OS versions return an URI of com.android instead of com.google.android if (uri.toString().startsWith("content://com.android.gallery3d.provider")) { // use the com.google provider, not the com.android provider. uri = Uri.parse(uri.toString().replace("com.android.gallery3d","com.google.android.gallery3d")); } InputStream is = null; ContentResolver res = context.getContentResolver(); try { is = res.openInputStream(uri); File file = FileUtil.getTemporaryFile(); FileUtil.inputStreamToFile(file, is); if (file.length() > 0) { path = file.getAbsolutePath(); } } catch (FileNotFoundException e) { // do nothing } } return path; } /** * 将InputStream写入文件 * @param file * @param is */ public static void inputStreamToFile(File file, InputStream is) { OutputStream os = null; try { os = new FileOutputStream(file); byte buffer[] = new byte[4*1024]; int len = 0; while ((len = is.read(buffer)) != -1) { os.write(buffer, 0, len); } os.flush(); os.close(); is.close(); } catch (Exception e) { throw new RuntimeException("File operation failed."); } } /** * 从文件里获取Mime类型 * * @param file 文件路径 * @return mime类型 */ public static String getMimeTypeOfFile(String file) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(file, options); return options.outMimeType; } /** * 根据后缀打开文件 * * @param context * @param file */ public static void openFile(Context context, File file) { if (file.isFile()) { String fileName = file.getName(); Intent intent; if (checkEnding(fileName, context.getResources().getStringArray(R.array.fileEndingImage))) { intent = getImageFileIntent(file); context.startActivity(intent); } else if (checkEnding(fileName, context.getResources().getStringArray(R.array.fileEndingWebText))) { intent = getHtmlFileIntent(file); context.startActivity(intent); } else if (checkEnding(fileName, context.getResources().getStringArray(R.array.fileEndingPackage))) { intent = getApkFileIntent(file); context.startActivity(intent); } else if (checkEnding(fileName, context.getResources().getStringArray(R.array.fileEndingAudio))) { intent = getAudioFileIntent(file); context.startActivity(intent); } else if (checkEnding(fileName, context.getResources().getStringArray(R.array.fileEndingVideo))) { intent = getVideoFileIntent(file); context.startActivity(intent); } else if (checkEnding(fileName, context.getResources().getStringArray(R.array.fileEndingText))) { intent = getTextFileIntent(file); context.startActivity(intent); } else if (checkEnding(fileName, context.getResources().getStringArray(R.array.fileEndingPdf))) { intent = getPdfFileIntent(file); context.startActivity(intent); } else if (checkEnding(fileName, context.getResources().getStringArray(R.array.fileEndingWord))) { intent = getWordFileIntent(file); context.startActivity(intent); } else if (checkEnding(fileName, context.getResources().getStringArray(R.array.fileEndingExcel))) { intent = getExcelFileIntent(file); context.startActivity(intent); } else if (checkEnding(fileName, context.getResources().getStringArray(R.array.fileEndingPPT))) { intent = getPPTFileIntent(file); context.startActivity(intent); } else { Dialog.toast(R.string.open_file_error); } } else { Dialog.toast(R.string.open_file_error); } } /** * 检查要打开的文件的后缀是否在fileedings.xml中 * * @param fileEnding * @param fileEndings * @return */ private static boolean checkEnding(String fileEnding, String[] fileEndings) { for (String end : fileEndings) { if (fileEnding.endsWith(end)) { return true; } } return false; } /** * 获取用于打开HTML文件的intent * * @param file * @return */ private static Intent getHtmlFileIntent(File file) { Uri uri = Uri.parse(file.toString()).buildUpon().encodedAuthority("com.android.htmlfileprovider").scheme("content").encodedPath(file.toString()).build(); Intent intent = new Intent("android.intent.action.VIEW"); intent.setDataAndType(uri, "text/html"); return intent; } /** * 获取用于打开图片文件的intent * * @param file * @return */ private static Intent getImageFileIntent(File file) { Intent intent = new Intent("android.intent.action.VIEW"); intent.addCategory("android.intent.category.DEFAULT"); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Uri uri = Uri.fromFile(file); intent.setDataAndType(uri, "image/*"); return intent; } /** * 获取用于打开PDF文件的intent * * @param file * @return */ private static Intent getPdfFileIntent(File file) { Intent intent = new Intent("android.intent.action.VIEW"); intent.addCategory("android.intent.category.DEFAULT"); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Uri uri = Uri.fromFile(file); intent.setDataAndType(uri, "application/pdf"); return intent; } /** * 获取用于打开文本文件的intent * * @param file * @return */ private static Intent getTextFileIntent(File file) { Intent intent = new Intent("android.intent.action.VIEW"); intent.addCategory("android.intent.category.DEFAULT"); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Uri uri = Uri.fromFile(file); intent.setDataAndType(uri, "text/plain"); return intent; } /** * 获取用于打开音频文件的intent * * @param file * @return */ private static Intent getAudioFileIntent(File file) { Intent intent = new Intent("android.intent.action.VIEW"); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra("oneshot", 0); intent.putExtra("configchange", 0); Uri uri = Uri.fromFile(file); intent.setDataAndType(uri, "audio/*"); return intent; } /** * 获取用于打开视频文件的intent * * @param file * @return */ private static Intent getVideoFileIntent(File file) { Intent intent = new Intent("android.intent.action.VIEW"); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra("oneshot", 0); intent.putExtra("configchange", 0); Uri uri = Uri.fromFile(file); intent.setDataAndType(uri, "video/*"); return intent; } /** * 获取用于打开Word文件的intent * * @param file * @return */ private static Intent getWordFileIntent(File file) { Intent intent = new Intent("android.intent.action.VIEW"); intent.addCategory("android.intent.category.DEFAULT"); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Uri uri = Uri.fromFile(file); intent.setDataAndType(uri, "application/msword"); return intent; } /** * 获取用于打开Excel文件的intent * * @param file * @return */ private static Intent getExcelFileIntent(File file) { Intent intent = new Intent("android.intent.action.VIEW"); intent.addCategory("android.intent.category.DEFAULT"); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Uri uri = Uri.fromFile(file); intent.setDataAndType(uri, "application/vnd.ms-excel"); return intent; } /** * 获取用于打开PPT文件的intent * * @param file * @return */ private static Intent getPPTFileIntent(File file) { Intent intent = new Intent("android.intent.action.VIEW"); intent.addCategory("android.intent.category.DEFAULT"); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Uri uri = Uri.fromFile(file); intent.setDataAndType(uri, "application/vnd.ms-powerpoint"); return intent; } /** * 获取用于打开apk文件的intent * * @param file * @return */ private static Intent getApkFileIntent(File file) { Intent intent = new Intent(); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setAction(android.content.Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); return intent; } /** * 获取选择文件的绝对路径 * * @param context * @param uri * @return */ public static String getFileAbsolutePath(Context context, Uri uri) { final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; // DocumentProvider if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { // ExternalStorageProvider if (isExternalStorageDocument(uri)) { 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]; } // TODO handle non-primary volumes } // DownloadsProvider else if (isDownloadsDocument(uri)) { final String id = DocumentsContract.getDocumentId(uri); final Uri contentUri = ContentUris.withAppendedId( Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); return getDataColumn(context, contentUri, null, null); } // MediaProvider else if (isMediaDocument(uri)) { 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 getDataColumn(context, contentUri, selection, selectionArgs); } } // MediaStore (and general) else if ("content".equalsIgnoreCase(uri.getScheme())) { return getDataColumn(context, uri, null, null); } // File else if ("file".equalsIgnoreCase(uri.getScheme())) { return uri.getPath(); } return null; } public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) { Cursor cursor = null; final String column = "_data"; final String[] projection = {column}; try { cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); if (cursor != null && cursor.moveToFirst()) { final int column_index = cursor.getColumnIndexOrThrow(column); return cursor.getString(column_index); } } finally { if (cursor != null) cursor.close(); } return null; } public static boolean isExternalStorageDocument(Uri uri) { return "com.android.externalstorage.documents".equals(uri.getAuthority()); } public static boolean isDownloadsDocument(Uri uri) { return "com.android.providers.downloads.documents".equals(uri.getAuthority()); } public static boolean isMediaDocument(Uri uri) { return "com.android.providers.media.documents".equals(uri.getAuthority()); } }