我无法使用前置摄像头拍照。我的测试设备肯定有前后摄像头/功能。出于某种原因,图片仅与后置摄像头一起拍摄。这就是我所拥有的。注意:摄像头和参数是全局设置的。
@Override
public void surfaceCreated(SurfaceHolder holder)
{
camera = Camera.open();
parameter = camera.getParameters();
Camera.Size size = getBestPreviewSize(surfaceView.getWidth(), surfaceView.getHeight(), parameter);
parameter.setPreviewSize(size.width, size.height);
try {
camera.setPreviewDisplay(surfaceHolder);
} catch (Throwable ignored) {
Log.e(TAG, "set preview error: ", ignored);
}
camera.setParameters(parameter);
}
}
在surfaceChanged()
我启动相机预览。
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height)
{
// TODO Auto-generated method stub
if(isPreview == true)
{
camera.stopPreview();
isPreview = false;
}
if (camera != null)
{
try
{
camera.setPreviewDisplay(surfaceHolder);
camera.setDisplayOrientation(90);
camera.startPreview();
isPreview = true;
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
在surfaceDestroyed()
我发布了相机资源
@Override
public void surfaceDestroyed(SurfaceHolder holder)
{
if (camera != null) {
camera.stopPreview();
camera.release();
camera = null;
isPreview = false;
}
}
以下是返回预览尺寸的引用方法
private Camera.Size getBestPreviewSize(int width, int height,
Camera.Parameters parameters) {
Camera.Size result = null;
for (Camera.Size size : parameters.getSupportedPreviewSizes()) {
if (size.width <= width && size.height <= height) {
if (result == null) {
result = size;
} else {
int resultArea = result.width * result.height;
int newArea = size.width * size.height;
if (newArea > resultArea) {
result = size;
}
}
}
}
this.size = result;
return (result);
}
每当我想使用前置摄像头时 - 前置摄像头是一项附加功能,通常使用后置摄像头 - 我称之为frontCamera()
方法。所有这个方法都将camera-id设置为2,我认为这是frontCamera()
的标志。然后我用更新的参数设置参数并拍照。
private void frontCamera() {
parameter = camera.getParameters();
cameraId = findFrontFacingCamera();
if (cameraId < 0) {
//no front face camera
} else {
parameter.set("camera-id", 2);
camera.setParameters(parameter);
}
camera.takePicture(null,
null, myPictureCallback_JPG);
}
我对前脸摄像头的检查是通过findFrontFacingCamera()
方法
private int findFrontFacingCamera() {
cameraId = -1;
//search for the front facing camera
int numberOfCameras = Camera.getNumberOfCameras();
for (int i = 0; i<numberOfCameras; i++) {
CameraInfo cInfo = new CameraInfo();
Camera.getCameraInfo(i, cInfo);
if (cInfo.facing == CameraInfo.CAMERA_FACING_FRONT) {
Log.d(TAG, "Front Camera found");
cameraId = i;
break;
}
}
return cameraId;
}
最终注释:numberOfCameras
返回2,表示我的测试设备有两个摄像头。此外,我正在达到&#34;前置摄像头找到&#34;标签进一步说服我这不是硬件问题。无论出于何种原因,此代码仅使用后置摄像头拍摄图像。有任何想法吗?提前谢谢。
答案 0 :(得分:2)
请勿使用.open()
。使用.open(cameraID)
并传递前置摄像头的摄像头ID。