Last active
December 10, 2018 10:36
-
-
Save AlonsoFloo/54a056ada0700df692f43b9a60e5c36b to your computer and use it in GitHub Desktop.
Android camera utility class
This file contains 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
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