diff options
Diffstat (limited to 'app/src/main/java/com/xc3fff0e/xmanager/FileUtil.java')
-rw-r--r-- | app/src/main/java/com/xc3fff0e/xmanager/FileUtil.java | 604 |
1 files changed, 604 insertions, 0 deletions
diff --git a/app/src/main/java/com/xc3fff0e/xmanager/FileUtil.java b/app/src/main/java/com/xc3fff0e/xmanager/FileUtil.java new file mode 100644 index 0000000..d995925 --- /dev/null +++ b/app/src/main/java/com/xc3fff0e/xmanager/FileUtil.java @@ -0,0 +1,604 @@ +package com.xc3fff0e.xmanager; + +import android.content.ContentResolver; +import android.content.ContentUris; +import android.content.Context; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.ColorFilter; +import android.graphics.ColorMatrix; +import android.graphics.ColorMatrixColorFilter; +import android.graphics.LightingColorFilter; +import android.graphics.Matrix; +import android.graphics.Paint; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffXfermode; +import android.graphics.Rect; +import android.graphics.RectF; +import android.media.ExifInterface; +import android.net.Uri; +import android.os.Environment; +import android.provider.DocumentsContract; +import android.provider.MediaStore; +import android.text.TextUtils; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.net.URLDecoder; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; + +public class FileUtil { + +private static void createNewFile(String path) { +int lastSep = path.lastIndexOf(File.separator); +if (lastSep > 0) { +String dirPath = path.substring(0, lastSep); +makeDir(dirPath); +} + +File file = new File(path); + +try { +if (!file.exists()) +file.createNewFile(); +} catch (IOException e) { +e.printStackTrace(); +} +} + +public static String readFile(String path) { +createNewFile(path); + +StringBuilder sb = new StringBuilder(); +FileReader fr = null; +try { +fr = new FileReader(new File(path)); + +char[] buff = new char[1024]; +int length = 0; + +while ((length = fr.read(buff)) > 0) { +sb.append(new String(buff, 0, length)); +} +} catch (IOException e) { +e.printStackTrace(); +} finally { +if (fr != null) { +try { +fr.close(); +} catch (Exception e) { +e.printStackTrace(); +} +} +} + +return sb.toString(); +} + +public static void writeFile(String path, String str) { +createNewFile(path); +FileWriter fileWriter = null; + +try { +fileWriter = new FileWriter(new File(path), false); +fileWriter.write(str); +fileWriter.flush(); +} catch (IOException e) { +e.printStackTrace(); +} finally { +try { +if (fileWriter != null) +fileWriter.close(); +} catch (IOException e) { +e.printStackTrace(); +} +} +} + +public static void copyFile(String sourcePath, String destPath) { +if (!isExistFile(sourcePath)) return; +createNewFile(destPath); + +FileInputStream fis = null; +FileOutputStream fos = null; + +try { +fis = new FileInputStream(sourcePath); +fos = new FileOutputStream(destPath, false); + +byte[] buff = new byte[1024]; +int length = 0; + +while ((length = fis.read(buff)) > 0) { +fos.write(buff, 0, length); +} +} catch (IOException e) { +e.printStackTrace(); +} finally { +if (fis != null) { +try { +fis.close(); +} catch (IOException e) { +e.printStackTrace(); +} +} +if (fos != null) { +try { +fos.close(); +} catch (IOException e) { +e.printStackTrace(); +} +} +} +} + +public static void moveFile(String sourcePath, String destPath) { +copyFile(sourcePath, destPath); +deleteFile(sourcePath); +} + +public static void deleteFile(String path) { +File file = new File(path); + +if (!file.exists()) return; + +if (file.isFile()) { +file.delete(); +return; +} + +File[] fileArr = file.listFiles(); + +if (fileArr != null) { +for (File subFile : fileArr) { +if (subFile.isDirectory()) { +deleteFile(subFile.getAbsolutePath()); +} + +if (subFile.isFile()) { +subFile.delete(); +} +} +} + +file.delete(); +} + +public static boolean isExistFile(String path) { +File file = new File(path); +return file.exists(); +} + +public static void makeDir(String path) { +if (!isExistFile(path)) { +File file = new File(path); +file.mkdirs(); +} +} + +public static void listDir(String path, ArrayList<String> list) { +File dir = new File(path); +if (!dir.exists() || dir.isFile()) return; + +File[] listFiles = dir.listFiles(); +if (listFiles == null || listFiles.length <= 0) return; + +if (list == null) return; +list.clear(); +for (File file : listFiles) { +list.add(file.getAbsolutePath()); +} +} + +public static boolean isDirectory(String path) { +if (!isExistFile(path)) return false; +return new File(path).isDirectory(); +} + +public static boolean isFile(String path) { +if (!isExistFile(path)) return false; +return new File(path).isFile(); +} + +public static long getFileLength(String path) { +if (!isExistFile(path)) return 0; +return new File(path).length(); +} + +public static String getExternalStorageDir() { +return Environment.getExternalStorageDirectory().getAbsolutePath(); +} + +public static String getPackageDataDir(Context context) { +return context.getExternalFilesDir(null).getAbsolutePath(); +} + +public static String getPublicDir(String type) { +return Environment.getExternalStoragePublicDirectory(type).getAbsolutePath(); +} + +public static String convertUriToFilePath(final Context context, final Uri uri) { +String path = null; +if (DocumentsContract.isDocumentUri(context, uri)) { +if (isExternalStorageDocument(uri)) { +final String docId = DocumentsContract.getDocumentId(uri); +final String[] split = docId.split(":"); +final String type = split[0]; + +if ("primary".equalsIgnoreCase(type)) { +path = Environment.getExternalStorageDirectory() + "/" + split[1]; +} +} else if (isDownloadsDocument(uri)) { +final String id = DocumentsContract.getDocumentId(uri); + +if (!TextUtils.isEmpty(id)) { +if (id.startsWith("raw:")) { +return id.replaceFirst("raw:", ""); +} +} + +final Uri contentUri = ContentUris +.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); + +path = getDataColumn(context, contentUri, null, null); +} 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 = MediaStore.Audio.Media._ID + "=?"; +final String[] selectionArgs = new String[]{ +split[1] +}; + +path = getDataColumn(context, contentUri, selection, selectionArgs); +} +} else if (ContentResolver.SCHEME_CONTENT.equalsIgnoreCase(uri.getScheme())) { +path = getDataColumn(context, uri, null, null); +} else if (ContentResolver.SCHEME_FILE.equalsIgnoreCase(uri.getScheme())) { +path = uri.getPath(); +} + +if (path != null) { +try { +return URLDecoder.decode(path, "UTF-8"); +}catch(Exception e){ +return null; +} +} +return null; +} + +private static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) { +Cursor cursor = null; + +final String column = MediaStore.Images.Media.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); +} +} catch (Exception e) { + +} finally { +if (cursor != null) { +cursor.close(); +} +} +return null; +} + + +private static boolean isExternalStorageDocument(Uri uri) { +return "com.android.externalstorage.documents".equals(uri.getAuthority()); +} + +private static boolean isDownloadsDocument(Uri uri) { +return "com.android.providers.downloads.documents".equals(uri.getAuthority()); +} + +private static boolean isMediaDocument(Uri uri) { +return "com.android.providers.media.documents".equals(uri.getAuthority()); +} + +private static void saveBitmap(Bitmap bitmap, String destPath) { +FileOutputStream out = null; +FileUtil.createNewFile(destPath); +try { +out = new FileOutputStream(new File(destPath)); +bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); +} catch (Exception e) { +e.printStackTrace(); +} finally { +try { +if (out != null) { +out.close(); +} +} catch (IOException e) { +e.printStackTrace(); +} +} +} + +public static Bitmap getScaledBitmap(String path, int max) { +Bitmap src = BitmapFactory.decodeFile(path); + +int width = src.getWidth(); +int height = src.getHeight(); +float rate = 0.0f; + +if (width > height) { +rate = max / (float) width; +height = (int) (height * rate); +width = max; +} else { +rate = max / (float) height; +width = (int) (width * rate); +height = max; +} + +return Bitmap.createScaledBitmap(src, width, height, true); +} + +public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { +final int width = options.outWidth; +final int height = options.outHeight; +int inSampleSize = 1; + +if (height > reqHeight || width > reqWidth) { +final int halfHeight = height / 2; +final int halfWidth = width / 2; + +while ((halfHeight / inSampleSize) >= reqHeight && (halfWidth / inSampleSize) >= reqWidth) { +inSampleSize *= 2; +} +} + +return inSampleSize; +} + +public static Bitmap decodeSampleBitmapFromPath(String path, int reqWidth, int reqHeight) { +final BitmapFactory.Options options = new BitmapFactory.Options(); +options.inJustDecodeBounds = true; +BitmapFactory.decodeFile(path, options); + +options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); + +options.inJustDecodeBounds = false; +return BitmapFactory.decodeFile(path, options); +} + +public static void resizeBitmapFileRetainRatio(String fromPath, String destPath, int max) { +if (!isExistFile(fromPath)) return; +Bitmap bitmap = getScaledBitmap(fromPath, max); +saveBitmap(bitmap, destPath); +} + +public static void resizeBitmapFileToSquare(String fromPath, String destPath, int max) { +if (!isExistFile(fromPath)) return; +Bitmap src = BitmapFactory.decodeFile(fromPath); +Bitmap bitmap = Bitmap.createScaledBitmap(src, max, max, true); +saveBitmap(bitmap, destPath); +} + +public static void resizeBitmapFileToCircle(String fromPath, String destPath) { +if (!isExistFile(fromPath)) return; +Bitmap src = BitmapFactory.decodeFile(fromPath); +Bitmap bitmap = Bitmap.createBitmap(src.getWidth(), +src.getHeight(), Bitmap.Config.ARGB_8888); +Canvas canvas = new Canvas(bitmap); + +final int color = 0xff424242; +final Paint paint = new Paint(); +final Rect rect = new Rect(0, 0, src.getWidth(), src.getHeight()); + +paint.setAntiAlias(true); +canvas.drawARGB(0, 0, 0, 0); +paint.setColor(color); +canvas.drawCircle(src.getWidth() / 2, src.getHeight() / 2, +src.getWidth() / 2, paint); +paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); +canvas.drawBitmap(src, rect, rect, paint); + +saveBitmap(bitmap, destPath); +} + +public static void resizeBitmapFileWithRoundedBorder(String fromPath, String destPath, int pixels) { +if (!isExistFile(fromPath)) return; +Bitmap src = BitmapFactory.decodeFile(fromPath); +Bitmap bitmap = Bitmap.createBitmap(src.getWidth(), src +.getHeight(), Bitmap.Config.ARGB_8888); +Canvas canvas = new Canvas(bitmap); + +final int color = 0xff424242; +final Paint paint = new Paint(); +final Rect rect = new Rect(0, 0, src.getWidth(), src.getHeight()); +final RectF rectF = new RectF(rect); +final float roundPx = pixels; + +paint.setAntiAlias(true); +canvas.drawARGB(0, 0, 0, 0); +paint.setColor(color); +canvas.drawRoundRect(rectF, roundPx, roundPx, paint); + +paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); +canvas.drawBitmap(src, rect, rect, paint); + +saveBitmap(bitmap, destPath); +} + +public static void cropBitmapFileFromCenter(String fromPath, String destPath, int w, int h) { +if (!isExistFile(fromPath)) return; +Bitmap src = BitmapFactory.decodeFile(fromPath); + +int width = src.getWidth(); +int height = src.getHeight(); + +if (width < w && height < h) +return; + +int x = 0; +int y = 0; + +if (width > w) +x = (width - w) / 2; + +if (height > h) +y = (height - h) / 2; + +int cw = w; +int ch = h; + +if (w > width) +cw = width; + +if (h > height) +ch = height; + +Bitmap bitmap = Bitmap.createBitmap(src, x, y, cw, ch); +saveBitmap(bitmap, destPath); +} + +public static void rotateBitmapFile(String fromPath, String destPath, float angle) { +if (!isExistFile(fromPath)) return; +Bitmap src = BitmapFactory.decodeFile(fromPath); +Matrix matrix = new Matrix(); +matrix.postRotate(angle); +Bitmap bitmap = Bitmap.createBitmap(src, 0, 0, src.getWidth(), src.getHeight(), matrix, true); +saveBitmap(bitmap, destPath); +} + +public static void scaleBitmapFile(String fromPath, String destPath, float x, float y) { +if (!isExistFile(fromPath)) return; +Bitmap src = BitmapFactory.decodeFile(fromPath); +Matrix matrix = new Matrix(); +matrix.postScale(x, y); + +int w = src.getWidth(); +int h = src.getHeight(); + +Bitmap bitmap = Bitmap.createBitmap(src, 0, 0, w, h, matrix, true); +saveBitmap(bitmap, destPath); +} + +public static void skewBitmapFile(String fromPath, String destPath, float x, float y) { +if (!isExistFile(fromPath)) return; +Bitmap src = BitmapFactory.decodeFile(fromPath); +Matrix matrix = new Matrix(); +matrix.postSkew(x, y); + +int w = src.getWidth(); +int h = src.getHeight(); + +Bitmap bitmap = Bitmap.createBitmap(src, 0, 0, w, h, matrix, true); +saveBitmap(bitmap, destPath); +} + +public static void setBitmapFileColorFilter(String fromPath, String destPath, int color) { +if (!isExistFile(fromPath)) return; +Bitmap src = BitmapFactory.decodeFile(fromPath); +Bitmap bitmap = Bitmap.createBitmap(src, 0, 0, +src.getWidth() - 1, src.getHeight() - 1); +Paint p = new Paint(); +ColorFilter filter = new LightingColorFilter(color, 1); +p.setColorFilter(filter); +Canvas canvas = new Canvas(bitmap); +canvas.drawBitmap(bitmap, 0, 0, p); +saveBitmap(bitmap, destPath); +} + +public static void setBitmapFileBrightness(String fromPath, String destPath, float brightness) { +if (!isExistFile(fromPath)) return; +Bitmap src = BitmapFactory.decodeFile(fromPath); +ColorMatrix cm = new ColorMatrix(new float[] +{ +1, 0, 0, 0, brightness, +0, 1, 0, 0, brightness, +0, 0, 1, 0, brightness, +0, 0, 0, 1, 0 +}); + +Bitmap bitmap = Bitmap.createBitmap(src.getWidth(), src.getHeight(), src.getConfig()); +Canvas canvas = new Canvas(bitmap); +Paint paint = new Paint(); +paint.setColorFilter(new ColorMatrixColorFilter(cm)); +canvas.drawBitmap(src, 0, 0, paint); +saveBitmap(bitmap, destPath); +} + +public static void setBitmapFileContrast(String fromPath, String destPath, float contrast) { +if (!isExistFile(fromPath)) return; +Bitmap src = BitmapFactory.decodeFile(fromPath); +ColorMatrix cm = new ColorMatrix(new float[] +{ +contrast, 0, 0, 0, 0, +0, contrast, 0, 0, 0, +0, 0, contrast, 0, 0, +0, 0, 0, 1, 0 +}); + +Bitmap bitmap = Bitmap.createBitmap(src.getWidth(), src.getHeight(), src.getConfig()); +Canvas canvas = new Canvas(bitmap); +Paint paint = new Paint(); +paint.setColorFilter(new ColorMatrixColorFilter(cm)); +canvas.drawBitmap(src, 0, 0, paint); + +saveBitmap(bitmap, destPath); +} + +public static int getJpegRotate(String filePath) { +int rotate = 0; +try { +ExifInterface exif = new ExifInterface(filePath); +int iOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, -1); + +switch (iOrientation) { +case ExifInterface.ORIENTATION_ROTATE_90: +rotate = 90; +break; +case ExifInterface.ORIENTATION_ROTATE_180: +rotate = 180; +break; +case ExifInterface.ORIENTATION_ROTATE_270: +rotate = 270; +break; +default: +rotate = 0; +break; +} +} +catch (IOException e) { +return 0; +} + +return rotate; +} +public static File createNewPictureFile(Context context) { +SimpleDateFormat date = new SimpleDateFormat("yyyyMMdd_HHmmss"); +String fileName = date.format(new Date()) + ".jpg"; +File file = new File(context.getExternalFilesDir(Environment.DIRECTORY_DCIM).getAbsolutePath() + File.separator + fileName); +return file; +} +}
\ No newline at end of file |