package com.forfan.bigbang.cropper; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Environment; import android.provider.MediaStore; import android.util.Log; import com.forfan.bigbang.cropper.handler.CropImage; import java.io.File; /** * Revision: * - 10:00 2014/10/03 Basic utils. * - 11:30 2014/10/03 Add static methods for generating crop intents. * - 15:00 2014/10/03 Finish the logic of handling crop intents. * - 12:20 2014/10/04 Add "scaleUpIfNeeded" crop options for scaling up cropped images if the size is too small. * - 16:30 2015/05/22 Fixed the error that crop from gallery doest work on some Kitkat devices. * - 23:30 2015/08/20 Add support to pick or capture photo without crop. * - 23:00 2015/09/05 Add compress features. */ public class CropHelper { public static final String TAG = "CropHelper"; /** * request code of Activities or Fragments * You will have to change the values of the request codes below if they conflict with your own. */ public static final int REQUEST_CROP = 127; public static final int REQUEST_CAMERA = 128; public static final int REQUEST_PICK = 129; public static final String CROP_CACHE_FOLDER = "PhotoCropper"; public static Uri generateUri() { File cacheFolder = new File(Environment.getExternalStorageDirectory() + File.separator + CROP_CACHE_FOLDER); if (!cacheFolder.exists()) { try { boolean result = cacheFolder.mkdir(); Log.d(TAG, "generateUri " + cacheFolder + " result: " + (result ? "succeeded" : "failed")); } catch (Exception e) { Log.e(TAG, "generateUri failed: " + cacheFolder, e); } } String name = String.format("image-%d.jpg", System.currentTimeMillis()); return Uri .fromFile(cacheFolder) .buildUpon() .appendPath(name) .build(); } public static boolean isPhotoReallyCropped(Uri uri) { File file = new File(uri.getPath()); long length = file.length(); return length > 0; } public static void handleResult(CropHandler handler, int requestCode, int resultCode, Intent data) { if (handler == null) return; if (resultCode == Activity.RESULT_CANCELED) { handler.onCancel(); } else if (resultCode == Activity.RESULT_OK) { CropParams cropParams = handler.getCropParams(); if (cropParams == null) { handler.onFailed("CropHandler's params MUST NOT be null!"); return; } switch (requestCode) { case REQUEST_PICK: case REQUEST_CROP: if (isPhotoReallyCropped(cropParams.uri)) { Log.d(TAG, "Photo cropped!"); onPhotoCropped(handler, cropParams); break; } else { Context context = handler.getCropParams().context; if (context != null) { if (data != null && data.getData() != null) { String path = CropFileUtils.getSmartFilePath(context, data.getData()); boolean result = CropFileUtils.copyFile(path, cropParams.uri.getPath()); if (!result) { handler.onFailed("Copy file to cached folder failed"); break; } } else { handler.onFailed("Returned data is null " + data); break; } } else { handler.onFailed("CropHandler's context MUST NOT be null!"); } } case REQUEST_CAMERA: // if (cropParams.enable) { // // Send this Uri to Crop // Intent intent = buildCropFromUriIntent(cropParams); // handler.handleIntent(intent, REQUEST_CROP); // } else { Log.d(TAG, "Photo cropped!"); onPhotoCropped(handler, cropParams); // } break; } } } private static void onPhotoCropped(CropHandler handler, CropParams cropParams) { handler.onPhotoCropped(cropParams.uri); // if (cropParams.compress) { // Uri originUri = cropParams.uri; // Uri compressUri = CropHelper.generateUri(); // CompressImageUtils.compressImageFile(cropParams, originUri, compressUri); // handler.onCompressed(compressUri); // } else { // handler.onPhotoCropped(cropParams.uri); // } } // None-Crop Intents public static Intent buildGalleryIntent(CropParams params) { Intent intent; if (params.enable) { intent = buildCropIntent(Intent.ACTION_PICK, params); } else { // intent = new Intent(Intent.ACTION_GET_CONTENT) // .setType("image/*") // .putExtra(MediaStore.EXTRA_OUTPUT, params.uri); intent = new Intent(Intent.ACTION_PICK); intent.setType("image/*"); // Intent albumIntent = new Intent(Intent.ACTION_PICK, null); // albumIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); } return intent; } public static Intent buildCameraIntent(CropParams params) { return new Intent(MediaStore.ACTION_IMAGE_CAPTURE) .putExtra(MediaStore.EXTRA_OUTPUT, params.uri); } // Crop Intents private static Intent buildCropFromUriIntent(CropParams params) { return buildCropIntent("com.android.camera.action.CROP", params); } private static Intent buildCropIntent(String action, CropParams params) { return new Intent(action) .setDataAndType(params.uri, params.type) .putExtra("crop", "true") .putExtra("scale", params.scale) .putExtra("aspectX", params.aspectX) .putExtra("aspectY", params.aspectY) .putExtra("outputX", params.outputX) .putExtra("outputY", params.outputY) .putExtra("return-data", params.returnData) .putExtra("outputFormat", params.outputFormat) .putExtra("noFaceDetection", params.noFaceDetection) .putExtra("scaleUpIfNeeded", params.scaleUpIfNeeded) .putExtra(MediaStore.EXTRA_OUTPUT, params.uri); } // Clear Cache public static boolean clearCacheDir() { File cacheFolder = new File(Environment.getExternalStorageDirectory() + File.separator + CROP_CACHE_FOLDER); if (cacheFolder.exists() && cacheFolder.listFiles() != null) { for (File file : cacheFolder.listFiles()) { boolean result = file.delete(); Log.d(TAG, "Delete " + file.getAbsolutePath() + (result ? " succeeded" : " failed")); } return true; } return false; } public static boolean clearCachedCropFile(Uri uri) { if (uri == null) return false; File file = new File(uri.getPath()); if (file.exists()) { boolean result = file.delete(); Log.d(TAG, "Delete " + file.getAbsolutePath() + (result ? " succeeded" : " failed")); return result; } return false; } }