/** * Author: Mario Velasco Casquero * Date: 08/09/2015 * Email: m3ario@gmail.com */ public class ImagePicker { private static final int DEFAULT_MIN_WIDTH_QUALITY = 400; // min pixels private static final String TAG = "ImagePicker"; private static final String TEMP_IMAGE_NAME = "tempImage"; public static int minWidthQuality = DEFAULT_MIN_WIDTH_QUALITY; public static Intent getPickImageIntent(Context context) { Intent chooserIntent = null; List intentList = new ArrayList<>(); Intent pickIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); takePhotoIntent.putExtra("return-data", true); takePhotoIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(getTempFile(context))); intentList = addIntentsToList(context, intentList, pickIntent); intentList = addIntentsToList(context, intentList, takePhotoIntent); if (intentList.size() > 0) { chooserIntent = Intent.createChooser(intentList.remove(intentList.size() -1), context.getString(R.string.pick_image_intent_text)); chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentList.toArray(new Parcelable[]{})); } return chooserIntent; } private static List addIntentsToList(Context context, List list, Intent intent) { List resInfo = context.getPackageManager().queryIntentActivities(intent, 0); for (ResolveInfo resolveInfo : resInfo) { String packageName = resolveInfo.activityInfo.packageName; Intent targetedIntent = new Intent(intent); targetedIntent.setPackage(packageName); list.add(targetedIntent); Log.d(TAG, "Intent: " + intent.getAction() + " package: " + packageName); } return list; } public static Bitmap getImageFromResult(Context context, int resultCode, Intent imageReturnedIntent) { Log.d(TAG, "getImageFromResult, resultCode: " + resultCode); Bitmap bm = null; File imageFile = getTempFile(context); if (resultCode == Activity.RESULT_OK) { Uri selectedImage; if (imageReturnedIntent == null) { /** CAMERA **/ selectedImage = Uri.fromFile(imageFile); } else { /** ALBUM **/ selectedImage = imageReturnedIntent.getData(); } Log.d(TAG, "selectedImage: " + selectedImage); bm = getImageResized(context, selectedImage); if (isCamera) { bm = rotateIfNeeded(context, bm, imageFile); } } return bm; } private static File getTempFile(Context context) { File imageFile = new File(context.getExternalCacheDir(), TEMP_IMAGE_NAME); imageFile.getParentFile().mkdirs(); return imageFile; } private static Bitmap decodeBitmap(Context context, Uri theUri, int sampleSize) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = sampleSize; AssetFileDescriptor fileDescriptor = null; try { fileDescriptor = context.getContentResolver().openAssetFileDescriptor(theUri, "r"); } catch (FileNotFoundException e) { e.printStackTrace(); } Bitmap actuallyUsableBitmap = BitmapFactory.decodeFileDescriptor( fileDescriptor.getFileDescriptor(), null, options); Log.d(TAG, options.inSampleSize + " sample method bitmap ... " + actuallyUsableBitmap.getWidth() + " " + actuallyUsableBitmap.getHeight()); return actuallyUsableBitmap; } private static Bitmap getImageResized(Context context, Uri selectedImage) { Bitmap bm = null; int sampleSize = 7; // TODO improve resizer do { sampleSize -= 2; bm = decodeBitmap(context, selectedImage, sampleSize); Log.d(TAG, "resizer: new bitmap width = " + bm.getWidth()); } while (bm.getWidth() < minWidthQuality && sampleSize > 1); return bm; } private static Bitmap rotateIfNeeded(Context context, Bitmap bm, File imageFile) { int rot = getCameraPhotoOrientation(context, imageFile); if (rot != 0) { bm = new RotateOrientation().RotateOrientationCall(bm, rot); } // saveBitmap(imageFile, bm); return bm; } // private static void saveBitmap(File imageFile, Bitmap bm) { // Log.d(TAG, "Saving image ... "); // imageFile.getParentFile().mkdirs(); // FileOutputStream out = null; // try { // out = new FileOutputStream(imageFile); // bm.compress(Bitmap.CompressFormat.PNG, 90, out); // } catch (Exception e) { // e.printStackTrace(); // } finally { // try { // if (out != null) { // out.close(); // } // } catch (IOException e) { // e.printStackTrace(); // } // } // Log.d(TAG, "Image saved"); // } private static int getCameraPhotoOrientation(Context context, File imageFile) { int rotate = 0; try { context.getContentResolver().notifyChange(Uri.fromFile(imageFile), null); ExifInterface exif = new ExifInterface(imageFile.getAbsolutePath()); int orientation = exif.getAttributeInt( ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_270: rotate = 270; break; case ExifInterface.ORIENTATION_ROTATE_180: rotate = 180; break; case ExifInterface.ORIENTATION_ROTATE_90: rotate = 90; break; } Log.d(TAG, "Exit orientation: " + orientation); } catch (Exception e) { e.printStackTrace(); } return rotate; } private static class RotateOrientation { Bitmap RotateOrientationCall(Bitmap src, float degree) { Matrix matrix = new Matrix(); matrix.postRotate(degree); Bitmap bmOut = Bitmap.createBitmap(src, 0, 0, src.getWidth(), src.getHeight(), matrix, true); return bmOut; } } }