Created
October 24, 2017 15:43
-
-
Save TheLester/5a9a0e3a8c1d75719e4e888cb48bf121 to your computer and use it in GitHub Desktop.
This file contains hidden or 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
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