Assorted refactorings on CamActivity.

This commit is contained in:
2013-11-28 16:04:18 -04:30
parent 5910c711d8
commit 770f6b2476

View File

@@ -22,32 +22,32 @@ public class CameraPreview extends ViewGroup implements SurfaceHolder.Callback,
private final String TAG = "SURFVIEW"; private final String TAG = "SURFVIEW";
private final String CLASS_NAME = CameraPreview.class.getSimpleName(); private final String CLASS_NAME = CameraPreview.class.getSimpleName();
private Size mPreviewSize; private Size previewSize;
private List<Size> mSupportedPreviewSizes; private List<Size> supportedPreviewSizes;
private CameraImageMonitor camMonitor; private CameraImageMonitor imgMonitor;
private Activity parentActivity; private Activity parentActivity;
private SurfaceView mSurfaceView; private SurfaceView surfaceView;
private SurfaceHolder mHolder; private SurfaceHolder holder;
private Camera mCamera; private Camera camera;
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public CameraPreview(Context context, Camera camera){ public CameraPreview(Context context, Camera camera){
super(context); super(context);
parentActivity = (Activity)context; parentActivity = (Activity)context;
mSurfaceView = new SurfaceView(context); surfaceView = new SurfaceView(context);
mHolder = mSurfaceView.getHolder(); holder = surfaceView.getHolder();
mHolder.addCallback(this); holder.addCallback(this);
if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.HONEYCOMB) if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.HONEYCOMB)
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
} }
public void setCamera(Camera camera){ public void setCamera(Camera camera){
mCamera = camera; this.camera = camera;
if(mCamera != null){ if(this.camera != null){
camMonitor = CameraImageMonitor.getInstance(); imgMonitor = CameraImageMonitor.getInstance();
mSupportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes(); supportedPreviewSizes = this.camera.getParameters().getSupportedPreviewSizes();
requestLayout(); requestLayout();
} }
} }
@@ -55,43 +55,42 @@ public class CameraPreview extends ViewGroup implements SurfaceHolder.Callback,
public void surfaceCreated(SurfaceHolder holder){ public void surfaceCreated(SurfaceHolder holder){
// The Surface has been created, now tell the camera where to draw the preview. // The Surface has been created, now tell the camera where to draw the preview.
try { try {
if(mCamera != null){ if(camera != null)
mCamera.setPreviewDisplay(holder); camera.setPreviewDisplay(holder);
}
} catch (IOException e) { } catch (IOException e) {
Logger.log_d(TAG, "Error setting camera preview: " + e.getMessage()); Logger.log_d(TAG, "Error setting camera preview: " + e.getMessage());
} }
} }
public void surfaceDestroyed(SurfaceHolder holder){ public void surfaceDestroyed(SurfaceHolder holder){
if(mCamera != null){ if(camera != null)
mCamera.stopPreview(); camera.stopPreview();
}
} }
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h){ public void surfaceChanged(SurfaceHolder tmpHolder, int format, int w, int h){
if(mHolder.getSurface() == null){ int result;
int rotation;
int degrees = 0;
Camera.Parameters camParams;
if(this.holder.getSurface() == null || camera == null)
return; return;
}
try{ try{ camera.stopPreview(); }catch (Exception e){ }
mCamera.stopPreview();
}catch (Exception e){ }
requestLayout(); requestLayout();
Camera.Parameters camParams = mCamera.getParameters(); camParams = camera.getParameters();
/*Size optimal = getOptimalPreviewSize(camParams.getSupportedPreviewSizes(), w, h); /*Size optimal = getOptimalPreviewSize(camParams.getSupportedPreviewSizes(), w, h);
if(ProjectConstants.DEBUG) if(ProjectConstants.DEBUG)
Log.d(TAG, CLASS_NAME + ".surfaceChanged() :: Preview size set at (" + optimal.width + ", " + optimal.height + ")");*/ Log.d(TAG, CLASS_NAME + ".surfaceChanged() :: Preview size set at (" + optimal.width + ", " + optimal.height + ")");*/
camParams.setPreviewSize(mPreviewSize.width, mPreviewSize.height); camParams.setPreviewSize(previewSize.width, previewSize.height);
mCamera.setParameters(camParams); camera.setParameters(camParams);
android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo(); android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo();
android.hardware.Camera.getCameraInfo(0, info); android.hardware.Camera.getCameraInfo(0, info);
int rotation = parentActivity.getWindowManager().getDefaultDisplay().getRotation(); rotation = parentActivity.getWindowManager().getDefaultDisplay().getRotation();
int degrees = 0;
switch (rotation) { switch (rotation) {
case Surface.ROTATION_0: degrees = 0; break; case Surface.ROTATION_0: degrees = 0; break;
case Surface.ROTATION_90: degrees = 90; break; case Surface.ROTATION_90: degrees = 90; break;
@@ -99,21 +98,18 @@ public class CameraPreview extends ViewGroup implements SurfaceHolder.Callback,
case Surface.ROTATION_270: degrees = 270; break; case Surface.ROTATION_270: degrees = 270; break;
} }
int result;
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
result = (info.orientation + degrees) % 360; result = (info.orientation + degrees) % 360;
result = (360 - result) % 360; // compensate the mirror result = (360 - result) % 360; // compensate the mirror
} else { // back-facing } else { // back-facing
result = (info.orientation - degrees + 360) % 360; result = (info.orientation - degrees + 360) % 360;
} }
mCamera.setDisplayOrientation(result); camera.setDisplayOrientation(result);
camera.setPreviewCallback(this);
mCamera.setPreviewCallback(this);
try { try {
mCamera.setPreviewDisplay(mHolder); camera.setPreviewDisplay(this.holder);
mCamera.startPreview(); camera.startPreview();
}catch (Exception e){ }catch (Exception e){
Logger.log_d(TAG, CLASS_NAME + ".surfaceChanged() :: Error starting camera preview: " + e.getMessage()); Logger.log_d(TAG, CLASS_NAME + ".surfaceChanged() :: Error starting camera preview: " + e.getMessage());
} }
@@ -122,13 +118,14 @@ public class CameraPreview extends ViewGroup implements SurfaceHolder.Callback,
@Override @Override
public void onPreviewFrame(byte[] data, Camera camera){ public void onPreviewFrame(byte[] data, Camera camera){
Logger.log_d(TAG, CLASS_NAME + ".onPreviewFrame() :: Preview received"); Logger.log_d(TAG, CLASS_NAME + ".onPreviewFrame() :: Preview received");
Logger.log_d(TAG, CLASS_NAME + ".onPreviewFrame() :: Frame has" + (camMonitor.hasChanged() ? "" : " not") + " changed."); Logger.log_d(TAG, CLASS_NAME + ".onPreviewFrame() :: Frame has" + (imgMonitor.hasChanged() ? "" : " not") + " changed.");
if(!camMonitor.hasChanged()) if(!imgMonitor.hasChanged())
camMonitor.setImageData(data); imgMonitor.setImageData(data);
} }
public void removePreviewCallback(){ public void removePreviewCallback(){
mCamera.setPreviewCallback(null); if(camera != null)
camera.setPreviewCallback(null);
} }
private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) { private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {
@@ -174,9 +171,9 @@ public class CameraPreview extends ViewGroup implements SurfaceHolder.Callback,
int previewWidth = width; int previewWidth = width;
int previewHeight = height; int previewHeight = height;
if (mPreviewSize != null) { if (previewSize != null) {
previewWidth = mPreviewSize.width; previewWidth = previewSize.width;
previewHeight = mPreviewSize.height; previewHeight = previewSize.height;
} }
// Center the child SurfaceView within the parent. // Center the child SurfaceView within the parent.
@@ -198,8 +195,8 @@ public class CameraPreview extends ViewGroup implements SurfaceHolder.Callback,
final int height = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec); final int height = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec);
setMeasuredDimension(width, height); setMeasuredDimension(width, height);
if (mSupportedPreviewSizes != null) { if (supportedPreviewSizes != null) {
mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, width, height); previewSize = getOptimalPreviewSize(supportedPreviewSizes, width, height);
} }
} }
} }