Created
January 10, 2018 08:29
-
-
Save TonyNikolov/4aad23ea82360172385c04151841c915 to your computer and use it in GitHub Desktop.
How to handle camera result in production
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
compile 'com.android.support:exifinterface:26.1.0' | |
try { | |
//..First convert the Image to the allowable size so app do not throw Memory_Out_Bound Exception | |
BitmapFactory.Options options = new BitmapFactory.Options(); | |
// this will calculate the size of the image, without decoding it | |
options.inJustDecodeBounds = true; | |
// we load the image's dimension into options | |
BitmapFactory.decodeStream(getContentResolver().openInputStream(uri), null, options); | |
// we calculate the new image's dimensions as close as possible to the desired width/height | |
options.inSampleSize = calculateInSampleSize(options, ApiConstants.IMAGE_WIDTH, ApiConstants.IMAGE_HEIGHT); | |
// we set decoding to true | |
options.inJustDecodeBounds = false; | |
// we load in memory the downsized bitmap | |
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri), null, options); | |
// we use a utility class to handle the orientation for us | |
Bitmap bitmapNew = OrientationUtils.modifyOrientation(getApplicationContext(), bitmap, uri); | |
FileOutputStream fOut = new FileOutputStream(previewFile); | |
// recycle the loaded bitmap | |
if (bitmapNew != null) { | |
bitmapNew.compress(Bitmap.CompressFormat.JPEG, 70, fOut); | |
bitmapNew.recycle(); | |
} | |
// we save the new image to disk | |
fOut.flush(); | |
fOut.close(); | |
} catch (Exception e) { | |
Log.d("Image_exception", e.toString()); | |
} | |
private int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { | |
// Raw height and width of image | |
final int height = options.outHeight; | |
final int width = options.outWidth; | |
int inSampleSize = 1; | |
if (height > reqHeight || width > reqWidth) { | |
final int halfHeight = height / 2; | |
final int halfWidth = width / 2; | |
// Calculate the largest inSampleSize value that is a power of 2 and keeps both | |
// height and width larger than the requested height and width. | |
while ((halfHeight / inSampleSize) > reqHeight | |
&& (halfWidth / inSampleSize) > reqWidth) { | |
inSampleSize *= 2; | |
} | |
} | |
return inSampleSize; | |
} | |
public class OrientationUtils { | |
public static Bitmap modifyOrientation(Context context,Bitmap bitmap,Uri uri ) throws IOException { | |
ExifInterface ei = new ExifInterface(getPath(context,uri)); | |
int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); | |
switch (orientation) { | |
case ExifInterface.ORIENTATION_ROTATE_90: | |
return rotate(bitmap, 90); | |
case ExifInterface.ORIENTATION_ROTATE_180: | |
return rotate(bitmap, 180); | |
case ExifInterface.ORIENTATION_ROTATE_270: | |
return rotate(bitmap, 270); | |
case ExifInterface.ORIENTATION_FLIP_HORIZONTAL: | |
return flip(bitmap, true, false); | |
case ExifInterface.ORIENTATION_FLIP_VERTICAL: | |
return flip(bitmap, false, true); | |
default: | |
return bitmap; | |
} | |
} | |
private static String getPath(final Context context, final 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; | |
} | |
private 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 Bitmap rotate(Bitmap bitmap, float degrees) { | |
Matrix matrix = new Matrix(); | |
matrix.postRotate(degrees); | |
return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); | |
} | |
private static Bitmap flip(Bitmap bitmap, boolean horizontal, boolean vertical) { | |
Matrix matrix = new Matrix(); | |
matrix.preScale(horizontal ? -1 : 1, vertical ? -1 : 1); | |
return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); | |
} | |
/** | |
* @param uri The Uri to check. | |
* @return Whether the Uri authority is ExternalStorageProvider. | |
*/ | |
private static boolean isExternalStorageDocument(Uri uri) { | |
return "com.android.externalstorage.documents".equals(uri.getAuthority()); | |
} | |
/** | |
* @param uri The Uri to check. | |
* @return Whether the Uri authority is DownloadsProvider. | |
*/ | |
private static boolean isDownloadsDocument(Uri uri) { | |
return "com.android.providers.downloads.documents".equals(uri.getAuthority()); | |
} | |
/** | |
* @param uri The Uri to check. | |
* @return Whether the Uri authority is MediaProvider. | |
*/ | |
private static boolean isMediaDocument(Uri uri) { | |
return "com.android.providers.media.documents".equals(uri.getAuthority()); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment