Skip to content

Instantly share code, notes, and snippets.

@amadeu01
Created March 22, 2018 15:36
Show Gist options
  • Save amadeu01/ce7c6753993e13300fda273bc6be35db to your computer and use it in GitHub Desktop.
Save amadeu01/ce7c6753993e13300fda273bc6be35db to your computer and use it in GitHub Desktop.
Crop picture
package io.github.amadeu01.cameraproportions;
import android.Manifest;
import android.annotation.SuppressLint;
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.os.Build;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.support.annotation.RequiresPermission;
import android.support.v4.app.ActivityCompat;
import android.support.v4.view.ViewCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import com.github.florent37.camerafragment.CameraFragment;
import com.github.florent37.camerafragment.CameraFragmentApi;
import com.github.florent37.camerafragment.PreviewActivity;
import com.github.florent37.camerafragment.configuration.Configuration;
import com.github.florent37.camerafragment.internal.enums.MediaAction;
import com.github.florent37.camerafragment.internal.utils.Utils;
import com.github.florent37.camerafragment.listeners.CameraFragmentControlsAdapter;
import com.github.florent37.camerafragment.listeners.CameraFragmentResultAdapter;
import com.github.florent37.camerafragment.listeners.CameraFragmentResultListener;
import com.github.florent37.camerafragment.listeners.CameraFragmentStateAdapter;
import com.github.florent37.camerafragment.listeners.CameraFragmentVideoRecordTextAdapter;
import com.github.florent37.camerafragment.widgets.CameraSettingsView;
import com.github.florent37.camerafragment.widgets.CameraSwitchView;
import com.github.florent37.camerafragment.widgets.FlashSwitchView;
import com.github.florent37.camerafragment.widgets.MediaActionSwitchView;
import com.github.florent37.camerafragment.widgets.RecordButton;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
@SuppressLint("MissingPermission")
public class MainActivity extends AppCompatActivity {
public static final String FRAGMENT_TAG = "camera";
private static final int REQUEST_CAMERA_PERMISSIONS = 931;
private static final int REQUEST_PREVIEW_CODE = 1001;
CameraSettingsView settingsView;
FlashSwitchView flashSwitchView;
CameraSwitchView cameraSwitchView;
RecordButton recordButton;
MediaActionSwitchView mediaActionSwitchView;
TextView recordDurationText;
TextView recordSizeText;
View cameraLayout;
View addCameraButton;
View videoCrop;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
settingsView = findViewById(R.id.settings_view);
flashSwitchView = findViewById(R.id.flash_switch_view);
cameraSwitchView = findViewById(R.id.front_back_camera_switcher);
recordButton = findViewById(R.id.record_button);
mediaActionSwitchView = findViewById(R.id.photo_video_camera_switcher);
recordDurationText = findViewById(R.id.record_duration_text);
recordSizeText = findViewById(R.id.record_size_mb_text);
cameraLayout = findViewById(R.id.cameraLayout);
addCameraButton = findViewById(R.id.addCameraButton);
videoCrop = findViewById(R.id.view_crop);
recordButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onRecordButtonClicked(view);
}
});
}
public void onFlashSwitcClicked(View view) {
final CameraFragmentApi cameraFragment = getCameraFragment();
if (cameraFragment != null) {
cameraFragment.toggleFlashMode();
}
}
public void onSwitchCameraClicked(View view) {
final CameraFragmentApi cameraFragment = getCameraFragment();
if (cameraFragment != null) {
cameraFragment.switchCameraTypeFrontBack();
}
}
public void onRecordButtonClicked(View view) {
final CameraFragmentApi cameraFragment = getCameraFragment();
if (cameraFragment != null) {
cameraFragment.takePhotoOrCaptureVideo(
new CameraFragmentResultAdapter() {
@Override
public void onVideoRecorded(String filePath) {
Toast.makeText(getBaseContext(), "onVideoRecorded " + filePath, Toast.LENGTH_SHORT).show();
}
@Override
public void onPhotoTaken(byte[] bytes, String filePath) {
Toast.makeText(getBaseContext(), "onPhotoTaken " + filePath, Toast.LENGTH_SHORT).show();
}
},
String.valueOf(Environment.getExternalStorageDirectory()),
"photo0" + new Random().nextLong());
}
}
public void onSettingsClicked(View view) {
final CameraFragmentApi cameraFragment = getCameraFragment();
if (cameraFragment != null) {
cameraFragment.openSettingDialog();
}
}
public void onMediaActionSwitchClicked(View view) {
final CameraFragmentApi cameraFragment = getCameraFragment();
if (cameraFragment != null) {
cameraFragment.switchActionPhotoVideo();
}
}
public void onAddCameraClicked(View view) {
if (Build.VERSION.SDK_INT > 15) {
final String[] permissions = {
Manifest.permission.CAMERA,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE};
final List<String> permissionsToRequest = new ArrayList<>();
for (String permission : permissions) {
if (ActivityCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
permissionsToRequest.add(permission);
}
}
if (!permissionsToRequest.isEmpty()) {
ActivityCompat.requestPermissions(this, permissionsToRequest.toArray(new String[permissionsToRequest.size()]), REQUEST_CAMERA_PERMISSIONS);
} else addCamera();
} else {
addCamera();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (grantResults.length != 0) {
addCamera();
}
}
private String bitmapToFile(Bitmap bitmap) {
try {
String fileName = "photo" + new Random().nextLong() + ".jpg";
File file = new File(Environment.getExternalStorageDirectory(), fileName);
file.createNewFile();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100 , byteArrayOutputStream);
FileOutputStream fileOutputStream = new FileOutputStream(file);
fileOutputStream.write(byteArrayOutputStream.toByteArray());
fileOutputStream.flush();
fileOutputStream.close();
return file.getAbsolutePath();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
private int getExifOrientation(String filePath) {
ExifInterface exif = null;
try {
exif = new ExifInterface(filePath);
} catch (IOException ignore) {
}
return exif == null ? ExifInterface.ORIENTATION_UNDEFINED :
exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);
}
@RequiresPermission(Manifest.permission.CAMERA)
public void addCamera() {
addCameraButton.setVisibility(View.GONE);
cameraLayout.setVisibility(View.VISIBLE);
final CameraFragment cameraFragment =
CameraFragment.newInstance(
new Configuration.Builder()
.setCamera(Configuration.CAMERA_FACE_REAR)
.setMediaQuality(Configuration.MEDIA_QUALITY_HIGHEST)
.build()
);
getSupportFragmentManager().beginTransaction()
.replace(R.id.content, cameraFragment, FRAGMENT_TAG)
.commitAllowingStateLoss();
if (cameraFragment != null) {
cameraFragment.setResultListener(new CameraFragmentResultListener() {
@Override
public void onVideoRecorded(String filePath) {
Intent intent = PreviewActivity.newIntentVideo(MainActivity.this, filePath);
startActivityForResult(intent, REQUEST_PREVIEW_CODE);
}
@Override
public void onPhotoTaken(byte[] bytes, String filePath) {
//get width
int exifOrientationOriginal = getExifOrientation(filePath);
int cameraFragmentWidthInPx = cameraLayout.getWidth();
int cameraCropWidthInPx = videoCrop.getWidth();
int cameraCropHeightInPx = videoCrop.getHeight();
String mimeType = Utils.getMimeType(filePath);
Bitmap originalImage = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
int originalImageHeight = originalImage.getWidth();
int originalImageWidth = originalImage.getHeight();
float proportionWidthHeightOriginalImage = ((float) originalImageHeight) / originalImageWidth;
int cameraFragmentHeightInPx = (int) (proportionWidthHeightOriginalImage*cameraFragmentWidthInPx);
float scale = originalImageHeight/((float) cameraFragmentWidthInPx);
int cropWidth = (int) (cameraCropWidthInPx*scale);
int cropHeight = (int) (cameraCropHeightInPx*scale);
int left = (originalImageWidth - cropWidth)/2;
int top = (originalImageHeight - cropHeight)/2;
Matrix rotationMatrix = new Matrix();
// rotationMatrix.postRotate(90);
Bitmap imagemCortada = Bitmap.createBitmap(originalImage, left, top, cropWidth, cropHeight, rotationMatrix, false);
filePath = bitmapToFile(imagemCortada);
String mimeTypeAfterCropted = Utils.getMimeType(filePath);
final ExifInterface exif;
try {
exif = new ExifInterface(filePath);
exif.setAttribute(ExifInterface.TAG_ORIENTATION, "" + exifOrientationOriginal);
exif.saveAttributes();
} catch (IOException e) {
e.printStackTrace();
}
Intent intent = PreviewActivity.newIntentPhoto(MainActivity.this, filePath);
intent.putExtra("media_action_arg", Configuration.MEDIA_ACTION_PHOTO);
startActivityForResult(intent, REQUEST_PREVIEW_CODE);
}
});
cameraFragment.setStateListener(new CameraFragmentStateAdapter() {
@Override
public void onCurrentCameraBack() {
cameraSwitchView.displayBackCamera();
}
@Override
public void onCurrentCameraFront() {
cameraSwitchView.displayFrontCamera();
}
@Override
public void onFlashAuto() {
flashSwitchView.displayFlashAuto();
}
@Override
public void onFlashOn() {
flashSwitchView.displayFlashOn();
}
@Override
public void onFlashOff() {
flashSwitchView.displayFlashOff();
}
@Override
public void onCameraSetupForPhoto() {
mediaActionSwitchView.displayActionWillSwitchVideo();
recordButton.displayPhotoState();
flashSwitchView.setVisibility(View.VISIBLE);
}
@Override
public void onCameraSetupForVideo() {
mediaActionSwitchView.displayActionWillSwitchPhoto();
recordButton.displayVideoRecordStateReady();
flashSwitchView.setVisibility(View.GONE);
}
@Override
public void shouldRotateControls(int degrees) {
ViewCompat.setRotation(cameraSwitchView, degrees);
ViewCompat.setRotation(mediaActionSwitchView, degrees);
ViewCompat.setRotation(flashSwitchView, degrees);
ViewCompat.setRotation(recordDurationText, degrees);
ViewCompat.setRotation(recordSizeText, degrees);
}
@Override
public void onRecordStateVideoReadyForRecord() {
recordButton.displayVideoRecordStateReady();
}
@Override
public void onRecordStateVideoInProgress() {
recordButton.displayVideoRecordStateInProgress();
}
@Override
public void onRecordStatePhoto() {
recordButton.displayPhotoState();
}
@Override
public void onStopVideoRecord() {
recordSizeText.setVisibility(View.GONE);
//cameraSwitchView.setVisibility(View.VISIBLE);
settingsView.setVisibility(View.VISIBLE);
}
@Override
public void onStartVideoRecord(File outputFile) {
}
});
cameraFragment.setControlsListener(new CameraFragmentControlsAdapter() {
@Override
public void lockControls() {
cameraSwitchView.setEnabled(false);
recordButton.setEnabled(false);
settingsView.setEnabled(false);
flashSwitchView.setEnabled(false);
}
@Override
public void unLockControls() {
cameraSwitchView.setEnabled(true);
recordButton.setEnabled(true);
settingsView.setEnabled(true);
flashSwitchView.setEnabled(true);
}
@Override
public void allowCameraSwitching(boolean allow) {
cameraSwitchView.setVisibility(allow ? View.VISIBLE : View.GONE);
}
@Override
public void allowRecord(boolean allow) {
recordButton.setEnabled(allow);
}
@Override
public void setMediaActionSwitchVisible(boolean visible) {
mediaActionSwitchView.setVisibility(visible ? View.VISIBLE : View.INVISIBLE);
}
});
cameraFragment.setTextListener(new CameraFragmentVideoRecordTextAdapter() {
@Override
public void setRecordSizeText(long size, String text) {
recordSizeText.setText(text);
}
@Override
public void setRecordSizeTextVisible(boolean visible) {
recordSizeText.setVisibility(visible ? View.VISIBLE : View.GONE);
}
@Override
public void setRecordDurationText(String text) {
recordDurationText.setText(text);
}
@Override
public void setRecordDurationTextVisible(boolean visible) {
recordDurationText.setVisibility(visible ? View.VISIBLE : View.GONE);
}
});
}
}
private CameraFragmentApi getCameraFragment() {
return (CameraFragmentApi) getSupportFragmentManager().findFragmentByTag(FRAGMENT_TAG);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment