Created
March 22, 2018 15:36
-
-
Save amadeu01/ce7c6753993e13300fda273bc6be35db to your computer and use it in GitHub Desktop.
Crop picture
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
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