package net.coding.program.common;
import android.content.Context;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Display;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.WindowManager;
import java.util.List;
/**
* Created by chaochen on 15/1/12.
*/
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
public static String TAG = "CameraPreview";
private SurfaceHolder mHolder;
private Camera mCamera;
public CameraPreview(Context context, AttributeSet attrs) {
super(context, attrs);
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceCreated(SurfaceHolder holder) {
Log.d(TAG, "created");
}
private boolean checkCameraHardware(Context context) {
return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA);
}
public Camera getCameraInstance() {
try {
mCamera = Camera.open(); // attempt to get a Camera instance
Display display = ((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
if (display.getRotation() == Surface.ROTATION_0) {
mCamera.setDisplayOrientation(90);
} else if (display.getRotation() == Surface.ROTATION_270) {
mCamera.setDisplayOrientation(180);
}
} catch (Exception e) {
// Camera is not available (in use or does not exist)
}
return mCamera; // returns null if camera is unavailable
}
public void surfaceDestroyed(SurfaceHolder holder) {
stopAndReleaseCamera();
Log.d(TAG, "destroy");
}
public void stopAndReleaseCamera() {
try {
if (mCamera != null) {
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
} catch (Exception e) {
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
try {
Log.d(TAG, "surfaceChanged");
if (checkCameraHardware(getContext())) {
mCamera = getCameraInstance();
Camera.Parameters parameters = mCamera.getParameters();
List<Camera.Size> sizes = parameters.getSupportedPreviewSizes();
Camera.Size firstSize = sizes.get(0);
Camera.Size lastSize = sizes.get(sizes.size() - 1);
Camera.Size minSize = firstSize.width < lastSize.width ? firstSize : lastSize;
parameters.setPreviewSize(minSize.width, minSize.height);
mCamera.setParameters(parameters);
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();
}
if (mHolder.getSurface() == null) {
return;
}
mCamera.stopPreview();
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview();
} catch (Exception e) {
Log.d(TAG, "Error starting camera preview: " + e.getMessage());
}
}
}