/*
* Camera management
*/
/**
* Selects the last used camera or a front-facing one
*/
public void selectCamera()
{
int cameraID = preferences.getInt("cameraID", -1);
if (cameraID == -1)
{
// no camera was selected previously, select a front-facing one
int nCameras = Camera.getNumberOfCameras();
CameraInfo cameraInfo = new CameraInfo();
for (int i = 0; i < nCameras; i++)
{
Camera.getCameraInfo(i, cameraInfo);
if (cameraInfo.facing == CameraInfo.CAMERA_FACING_FRONT)
{
cameraID = i;
}
}
// there's no front camera
if (cameraID == -1)
{
cameraID = 0;
}
}
setPreviewSurface(previewSurface);
setupCamera(cameraID);
}
/**
* Sets the camera used for face detection
*
* @param cameraID the ID of the camera to use
*/
public void setupCamera(int cameraID)
{
// release previous one
if (camera != null)
{
camera.release();
camera = null;
}
// save selection
Editor editor = preferences.edit();
editor.putInt("cameraID", cameraID);
editor.commit();
try
{
// open camera
camera = Camera.open(cameraID);
// get smallest available preview size
Parameters params = camera.getParameters();
List<Size> psizes = params.getSupportedPreviewSizes();
Collections.sort(psizes, new Comparator<Size>()
{
@Override
public int compare(Size size1, Size size2)
{
long pixels1 = size1.height * size1.width;
long pixels2 = size2.height * size2.width;
return (pixels1 < pixels2) ? -1 : (pixels1 > pixels2) ? 1 : 0;
}
});
Size smallest = psizes.get(0);
params.setPreviewSize(smallest.width, smallest.height);
// set preferred preview format
params.setPreviewFormat(ImageFormat.NV21);
// save parameters
camera.setParameters(params);
// set preview display
camera.setPreviewDisplay(previewSurface.getHolder());
// set orientation
CameraInfo info = new CameraInfo();
Camera.getCameraInfo(cameraID, info);
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
int _rotation = wm.getDefaultDisplay().getRotation();
int degrees = 0;
switch (_rotation)
{
case Surface.ROTATION_0:
degrees = 0;
break;
case Surface.ROTATION_90:
degrees = 90;
break;
case Surface.ROTATION_180:
degrees = 180;
break;
case Surface.ROTATION_270:
degrees = 270;
break;
}
int result = (360 + info.orientation - degrees) % 360;
rotation = degrees;
camera.setDisplayOrientation(result);
swapMetrics = (result % 180 == 0);
// set camera in imageprocessor
if (processor != null)
processor.setCamera(camera, result);
calculator.loadSettings();
// start preview
camera.startPreview();
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}