mirror of https://github.com/ThmmyNoLife/mTHMMY
Apostolos Fanakis
6 years ago
3 changed files with 184 additions and 148 deletions
@ -0,0 +1,176 @@ |
|||
package gr.thmmy.mthmmy.utils; |
|||
|
|||
import android.content.ContentResolver; |
|||
import android.content.ContentValues; |
|||
import android.content.Context; |
|||
import android.content.Intent; |
|||
import android.content.pm.PackageManager; |
|||
import android.content.pm.ResolveInfo; |
|||
import android.content.res.AssetFileDescriptor; |
|||
import android.graphics.Bitmap; |
|||
import android.graphics.BitmapFactory; |
|||
import android.graphics.Matrix; |
|||
import android.media.ExifInterface; |
|||
import android.net.Uri; |
|||
import android.os.Environment; |
|||
import android.provider.MediaStore; |
|||
import android.support.annotation.NonNull; |
|||
import android.support.annotation.Nullable; |
|||
import android.support.v4.content.FileProvider; |
|||
import android.widget.Toast; |
|||
|
|||
import java.io.File; |
|||
import java.io.FileNotFoundException; |
|||
import java.io.FileOutputStream; |
|||
import java.text.SimpleDateFormat; |
|||
import java.util.Date; |
|||
import java.util.List; |
|||
import java.util.Locale; |
|||
|
|||
import timber.log.Timber; |
|||
|
|||
public class TakePhoto { |
|||
private static final int DEFAULT_MIN_WIDTH_QUALITY = 400; |
|||
|
|||
@Nullable |
|||
public static Intent getIntent(Context context, @NonNull File photoFile) { |
|||
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); |
|||
//Ensures that there's a camera activity to handle the intent
|
|||
if (takePictureIntent.resolveActivity(context.getPackageManager()) != null) { |
|||
Uri photoURI = FileProvider.getUriForFile(context, context.getPackageName() + |
|||
".provider", photoFile); |
|||
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); |
|||
|
|||
//Grants necessary permissions for Gallery to use the Uri
|
|||
List<ResolveInfo> resInfoList = context.getPackageManager(). |
|||
queryIntentActivities(takePictureIntent, PackageManager.MATCH_DEFAULT_ONLY); |
|||
for (ResolveInfo resolveInfo : resInfoList) { |
|||
String packageName = resolveInfo.activityInfo.packageName; |
|||
context.grantUriPermission(packageName, photoURI, |
|||
Intent.FLAG_GRANT_WRITE_URI_PERMISSION | |
|||
Intent.FLAG_GRANT_READ_URI_PERMISSION); |
|||
} |
|||
return takePictureIntent; |
|||
} |
|||
return null; |
|||
} |
|||
|
|||
public static Uri processResult(Context context, File photoFile) { |
|||
Bitmap bitmap; |
|||
Uri fileUri = FileProvider.getUriForFile(context, context.getPackageName() + ".provider", photoFile); |
|||
|
|||
bitmap = getImageResized(context, fileUri); |
|||
int rotation = getRotation(context, fileUri); |
|||
bitmap = rotate(bitmap, rotation); |
|||
|
|||
try { |
|||
FileOutputStream out = new FileOutputStream(photoFile); |
|||
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out); |
|||
out.flush(); |
|||
out.close(); |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
} |
|||
|
|||
return fileUri; |
|||
} |
|||
|
|||
@Nullable |
|||
public static File createImageFile(Context context) { |
|||
// Create an image file name
|
|||
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.FRANCE).format(new Date()); |
|||
String imageFileName = "mThmmy_" + timeStamp + ".jpg"; |
|||
|
|||
File imageFolder = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) + |
|||
File.separator + "mThmmy"); |
|||
|
|||
if (!imageFolder.exists()) { |
|||
if (!imageFolder.mkdirs()) { |
|||
Timber.w("Photos folder build returned false in %s", TakePhoto.class.getSimpleName()); |
|||
Toast.makeText(context, "Couldn't create photos directory", Toast.LENGTH_SHORT).show(); |
|||
return null; |
|||
} |
|||
} |
|||
|
|||
File photoFile = new File(imageFolder, imageFileName); |
|||
galleryAddPic(context, photoFile); |
|||
|
|||
return photoFile; |
|||
} |
|||
|
|||
private static void galleryAddPic(Context context, File photoFile) { |
|||
ContentValues values = new ContentValues(); |
|||
values.put(MediaStore.Images.Media.TITLE, photoFile.getName()); |
|||
values.put(MediaStore.Images.Media.DESCRIPTION, "mThmmy uploads image"); |
|||
values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis()); //TODO fix bug
|
|||
values.put(MediaStore.Images.ImageColumns.BUCKET_ID, photoFile.toString().toLowerCase(Locale.US).hashCode()); |
|||
values.put(MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME, photoFile.getName().toLowerCase(Locale.US)); |
|||
values.put("_data", photoFile.getAbsolutePath()); |
|||
|
|||
ContentResolver cr = context.getContentResolver(); |
|||
cr.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); |
|||
} |
|||
|
|||
private static Bitmap getImageResized(Context context, Uri selectedImage) { |
|||
Bitmap bm; |
|||
int[] sampleSizes = new int[]{5, 3, 2, 1}; |
|||
int i = 0; |
|||
do { |
|||
bm = decodeBitmap(context, selectedImage, sampleSizes[i]); |
|||
i++; |
|||
} while (bm.getWidth() < DEFAULT_MIN_WIDTH_QUALITY && i < sampleSizes.length); |
|||
return bm; |
|||
} |
|||
|
|||
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(); |
|||
} |
|||
|
|||
assert fileDescriptor != null; |
|||
return BitmapFactory.decodeFileDescriptor( |
|||
fileDescriptor.getFileDescriptor(), null, options); |
|||
} |
|||
|
|||
private static int getRotation(Context context, Uri imageUri) { |
|||
int rotation = 0; |
|||
try { |
|||
|
|||
context.getContentResolver().notifyChange(imageUri, null); |
|||
ExifInterface exif = new ExifInterface(imageUri.getPath()); |
|||
int orientation = exif.getAttributeInt( |
|||
ExifInterface.TAG_ORIENTATION, |
|||
ExifInterface.ORIENTATION_NORMAL); |
|||
|
|||
switch (orientation) { |
|||
case ExifInterface.ORIENTATION_ROTATE_270: |
|||
rotation = 270; |
|||
break; |
|||
case ExifInterface.ORIENTATION_ROTATE_180: |
|||
rotation = 180; |
|||
break; |
|||
case ExifInterface.ORIENTATION_ROTATE_90: |
|||
rotation = 90; |
|||
break; |
|||
} |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
} |
|||
return rotation; |
|||
} |
|||
|
|||
private static Bitmap rotate(Bitmap bm, int rotation) { |
|||
if (rotation != 0) { |
|||
Matrix matrix = new Matrix(); |
|||
matrix.postRotate(rotation); |
|||
return Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true); |
|||
} |
|||
return bm; |
|||
} |
|||
} |
Loading…
Reference in new issue