无法使用前置摄像头拍摄图像:Android
我不能用前置相机拍照。我的测试设备肯定具有前后摄像头/功能。由于某些原因,照片只能用后置相机拍摄。这是我的。注:摄像机和参数是全局设置的无法使用前置摄像头拍摄图像:Android,android,android-camera,Android,Android Camera,我不能用前置相机拍照。我的测试设备肯定具有前后摄像头/功能。由于某些原因,照片只能用后置相机拍摄。这是我的。注:摄像机和参数是全局设置的 @Override public void surfaceCreated(SurfaceHolder holder) { camera = Camera.open(); parameter = camera.getParameters(); Camera.Size size
@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);
}
我使用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;
}
private int findFrontFacingCamera(){
cameraId=-1;
//搜索前向摄像头
int numberOfCameras=Camera.getNumberOfCameras();
对于(int i=0;i不要使用.open()
。使用.open(cameraID)
并将前向摄像头的摄像头id传递给它。我明白你的意思。但我的问题是。此应用程序的一般用途是后向摄像头。前向摄像头的使用(自拍)这只是一个功能。我想我要寻找的是一种更新相机参数的方法,而不是为前向相机创建一个新的相机对象(应用程序从后向相机开始,在surfaceCreated中).有什么建议吗?没有。我所知道的获取前置摄像头的唯一方法是使用open并将正确的id传递给它。设置参数不会改变它使用的摄像头,当你拥有一个摄像头对象时,你已经选择了要使用的硬件。明白了。我相信这对我来说已经足够了,可以让它正常工作。谢谢
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;
}