Skip to content

Instantly share code, notes, and snippets.

@TheLester
Created October 24, 2017 15:43
Show Gist options
  • Save TheLester/5a9a0e3a8c1d75719e4e888cb48bf121 to your computer and use it in GitHub Desktop.
Save TheLester/5a9a0e3a8c1d75719e4e888cb48bf121 to your computer and use it in GitHub Desktop.
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder mHolder;
private Camera mCamera;
private List<Camera.Size> mSupportedPreviewSizes;
private Camera.Size mPreviewSize;
private int mCameraId;
public CameraPreview(Context context) {
super(context);
mHolder = getHolder();
mHolder.addCallback(this);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
final int width = resolveSize(getSuggestedMinimumWidth(), widthMeasureSpec);
final int height = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec);
if (mSupportedPreviewSizes != null) {
mPreviewSize = CameraUtils.getOptimalPreviewSize(mSupportedPreviewSizes, width, height);
}
if (mPreviewSize != null) {
float ratio = mPreviewSize.height >= mPreviewSize.width
? (float) mPreviewSize.height / (float) mPreviewSize.width
: (float) mPreviewSize.width / (float) mPreviewSize.height;
// One of these methods should be used, second method squishes preview slightly
setMeasuredDimension(width, (int) (width * ratio));
// setMeasuredDimension((int) (width * ratio), height);
} else {
setMeasuredDimension(width, height);
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
try {
releaseCamera();
mCameraId = CameraUtils.getFrontCameraId();
mCamera = Camera.open(mCameraId > 0 ? mCameraId : 0); //todo to separate thread?
} catch (Exception e) {
e.printStackTrace();
}
mSupportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes();
CameraUtils.setCameraDisplayOrientation(getContext(), mCameraId, mCamera);
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();
requestLayout();
} catch (IOException e) {
Timber.e("Camera error on surfaceCreated", e);
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
if (mHolder.getSurface() == null) {
return;
}
try {
mCamera.stopPreview();
} catch (Exception e) {
}
//now, recreate the camera preview
try {
if (mPreviewSize != null) {
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
mCamera.setParameters(parameters);
}
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview();
} catch (Exception e) {
Timber.e("Camera error on surfaceChanged ", e);
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
mCamera.stopPreview();
releaseCamera();
}
private void releaseCamera() {
if (mCamera != null) {
mCamera.release();
mCamera = null;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment