package com.maxiee.heartbeat.common; import android.annotation.SuppressLint; import android.content.Context; import android.database.Cursor; import android.graphics.Bitmap; import android.net.Uri; import android.os.Build; import android.os.Environment; import android.provider.DocumentsContract; import android.provider.MediaStore; import android.util.Log; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.channels.FileChannel; /** * Created by maxiee on 15-9-5. */ public class FileUtils { private final static String HB_PATH = "HeartBeat"; public static final String LONG_IMAGE_PATH = "LongImage"; private final static String DB = "heartbeat"; private final static String BACKUP_PATH = "Backup"; private final static String BACKUP_PREFIX = "[Backup]"; public final static String BACKUP_ZIP_PREFIX = "[AllBackup]"; public static final String IMAGE_PATH = "Image"; public final static int FILE_TYPE_DB = 0; public final static int FILE_TYPE_UNKNOWN = 1; public final static int FILE_TYPE_IMAGE = 2; public static String saveLongImage(Context context, Bitmap bitmap) { try { File heartBeatPath = new File(Environment.getExternalStorageDirectory(), HB_PATH); if (!heartBeatPath.exists()) { heartBeatPath.mkdir(); } File longImagePath = new File(heartBeatPath, LONG_IMAGE_PATH); if (!longImagePath.exists()) { longImagePath.mkdir(); } File longImageFile = new File( longImagePath, "[" + LONG_IMAGE_PATH + "][" + TimeUtils.getDate(context) + "].png" ); longImageFile.createNewFile(); ByteArrayOutputStream os = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 0, os); byte[] bytes = os.toByteArray(); FileOutputStream fos = new FileOutputStream(longImageFile); fos.write(bytes); fos.flush(); fos.close(); return longImageFile.toString(); } catch (Exception e) { e.printStackTrace(); return ""; } } @SuppressLint("NewApi") public static String uriToPath(Context context, Uri uri) { boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { final String docId = DocumentsContract.getDocumentId(uri); Log.d("maxiee", "docID:" + docId); final String[] split = docId.split(":"); final String type = split[0]; Uri contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; final String selection = "_id=?"; final String[] selectionArgs = new String[] {split[1]}; return getDataColumn(context, contentUri, selection, selectionArgs); } else if ("content".equalsIgnoreCase(uri.getScheme())){ return getDataColumn(context, uri, null, null); } 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; } private static File createDirIfNotExist(File dir) { if (!dir.exists()) dir.mkdir(); return dir; } public static File getHeartbeatDir() { File rootDir = new File(Environment.getExternalStorageDirectory(), HB_PATH); return createDirIfNotExist(rootDir); } public static File getBackupDir() { File rootDir = getHeartbeatDir(); File bakDir = new File(rootDir, BACKUP_PATH); return createDirIfNotExist(bakDir); } public static File getImageDir() { File rootDir = getHeartbeatDir(); File imageDir = new File(rootDir, IMAGE_PATH); return createDirIfNotExist(imageDir); } public static File generateBackupFile(Context context) throws IOException { File bakDir = getBackupDir(); File bakFile = new File( bakDir, BACKUP_PREFIX + String.format("[%s][%s]", DB, TimeUtils.getDate(context))); bakFile.createNewFile(); return bakFile; } public static File generateBackupAllZip(Context context) throws IOException { File bakDir = getBackupDir(); File bakZip = new File( bakDir, BACKUP_ZIP_PREFIX + String.format("[%s][%s]", DB, TimeUtils.getDate(context)) + ".zip"); return bakZip; } public static String copyImageToHeartBeat(String path) throws IOException { File fileToMove = new File(path); String fileName = fileToMove.getName(); File fileMoved = new File(FileUtils.getImageDir(), fileName); FileChannel toMove = new FileInputStream(fileToMove).getChannel(); FileChannel moved = new FileOutputStream(fileMoved).getChannel(); moved.transferFrom(toMove, 0, toMove.size()); toMove.close(); moved.close(); return fileName; } public static int detectFileType(String filename) { if (filename.endsWith(".png") || filename.endsWith(".JPG") || filename.endsWith(".jpg") || filename.endsWith(".PNG") || filename.endsWith(".gif") || filename.endsWith(".GIF")) { return FILE_TYPE_IMAGE; } if (filename.contains(BACKUP_PREFIX)) return FILE_TYPE_DB; return FILE_TYPE_UNKNOWN; } }