Skip to content

Instantly share code, notes, and snippets.

@AlonsoFloo
Last active December 10, 2018 10:36
Show Gist options
  • Save AlonsoFloo/54a056ada0700df692f43b9a60e5c36b to your computer and use it in GitHub Desktop.
Save AlonsoFloo/54a056ada0700df692f43b9a60e5c36b to your computer and use it in GitHub Desktop.
Android camera utility class
import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.media.ExifInterface;
import android.net.Uri;
import android.provider.MediaStore;
import android.support.annotation.FloatRange;
import android.support.annotation.IntRange;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import android.support.v4.content.ContextCompat;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public abstract class CameraUtil {
public interface FileReceivedListener {
void onFileReceived(@Nullable File file);
}
static final int PERMISION_REQUEST_IMAGE_CAPTURE = 545;
static final int REQUEST_IMAGE_CAPTURE = 54546;
private static File takePicturePendingFile = null;
private static boolean hasPermission(@NonNull Context context) {
return (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)
&& (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED);
}
private static void askForPermission(@NonNull Activity activity) {
ActivityCompat.requestPermissions(activity,
new String[]{
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
},
PERMISION_REQUEST_IMAGE_CAPTURE);
}
private static void askForPermission(@NonNull Fragment fragment) {
fragment.requestPermissions(
new String[]{
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
},
PERMISION_REQUEST_IMAGE_CAPTURE
);
}
public static boolean dispatchTakePictureIntent(@NonNull Fragment fragment) {
if (fragment.getContext() == null) {
return false;
}
if (!hasPermission(fragment.getContext())) {
askForPermission(fragment);
return false;
}
takePicturePendingFile = FileUtil.getNewTemporaryPublicPictureFile(fragment.getContext());
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(fragment.getContext().getPackageManager()) != null && takePicturePendingFile != null) {
Uri photoUri = FileUtil.getShareableUri(fragment.getContext(), takePicturePendingFile);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
fragment.startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
return true;
}
return false;
}
public static boolean dispatchTakePictureIntent(@NonNull Activity activity) {
if (!hasPermission(activity)) {
askForPermission(activity);
return false;
}
takePicturePendingFile = FileUtil.getNewTemporaryPublicPictureFile(activity);
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(activity.getPackageManager()) != null && takePicturePendingFile != null) {
Uri photoUri = FileUtil.getShareableUri(activity, takePicturePendingFile);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
activity.startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
return true;
}
return false;
}
public static boolean processTakePicturePermission(@NonNull Activity activity, int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == PERMISION_REQUEST_IMAGE_CAPTURE) {
boolean allTrue = true;
for (int index = 0; index < grantResults.length && allTrue; ++index) {
allTrue = grantResults[index] == PackageManager.PERMISSION_GRANTED;
}
if (allTrue) {
dispatchTakePictureIntent(activity);
}
return allTrue;
}
return false;
}
public static boolean processTakePicturePermission(@NonNull Fragment fragment, int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == PERMISION_REQUEST_IMAGE_CAPTURE) {
boolean allTrue = true;
for (int index = 0; index < grantResults.length && allTrue; ++index) {
allTrue = grantResults[index] == PackageManager.PERMISSION_GRANTED;
}
if (allTrue) {
dispatchTakePictureIntent(fragment);
}
return allTrue;
}
return false;
}
public static void proccessActivityResultForCamera(@NonNull final Context context, int requestCode, int resultCode, @NonNull FileReceivedListener fileReceivedListener) {
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK
&& takePicturePendingFile != null && takePicturePendingFile.exists()) {
BitmapUtil.rotateImageIfNeeded(context, takePicturePendingFile, new BitmapUtil.FileProcessed() {
@Override
public void onFileProcesses(@NonNull File file) {
fileReceivedListener.onFileReceived(file);
}
});
} else {
fileReceivedListener.onFileReceived(null);
}
takePicturePendingFile = null;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment