在表面视图中打开前置摄像头
Open the Front camera in a surface view
我收到异常 java.lang.RuntimeException: Fail to get camera info
在 Camera.getCameraInfo(cameraId,info);
我的代码是:
public void surfaceCreated(SurfaceHolder holder) {
int cameraId = -1;
for(int i=0;i<Camera.getNumberOfCameras();i++){
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(cameraId,info);
if(info.facing== Camera.CameraInfo.CAMERA_FACING_FRONT){
cameraId = i;
break;
}
}
camera = Camera.open(cameraId);
}
和清单还有:
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.front" />
<uses-feature android:name="android.hardware.camera.autofocus" />
缺少什么东西,我该如何解决?
欢迎任何帮助。
您遇到异常是因为您将 cameraId 初始化为 -1,这是错误的。
并传递它以获取相机信息
Camera.getCameraInfo(cameraId,info);
将 cameraId 初始化为 0 以消除异常。
我改变了方法;之前我正在实施 SurfaceHolder.Callback
但现在我创建了它的对象。
我将代码从 SurfaceCreated
移到了 onResume()
public void onResume() {
super.onResume();
for(int i=0;i<Camera.getNumberOfCameras();i++){
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(i,info);
if(info.facing== Camera.CameraInfo.CAMERA_FACING_FRONT){
cameraId = i;
break;
}
}
camera=Camera.open(cameraId);
camera.startPreview();
}
回调的对象是这样的:
SurfaceHolder.Callback surfaceCallback=new SurfaceHolder.Callback() {
public void surfaceCreated(SurfaceHolder holder) {
// no-op -- wait until surfaceChanged()
}
public void surfaceChanged(SurfaceHolder holder,
int format, int width,
int height) {
Camera.Parameters parameters=camera.getParameters();
Camera.Size size=getBestPreviewSize(width, height,
parameters);
Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
if (size!=null) {
parameters.setPreviewSize(size.width, size.height);
camera.setParameters(parameters);
camera.setDisplayOrientation(90);
cameraConfigured=true;
}
camera.startPreview();
}
public void surfaceDestroyed(SurfaceHolder holder) {
// no-op
}
};
这解决了我的问题。
此方法将return前置摄像头ID:
private int getFrontCameraId(){
int camId = -1;
int numberOfCameras = Camera.getNumberOfCameras();
Camera.CameraInfo ci = new Camera.CameraInfo();
for(int i = 0;i < numberOfCameras;i++){
Camera.getCameraInfo(i,ci);
if(ci.facing == Camera.CameraInfo.CAMERA_FACING_FRONT){
camId = i;
}
}
return camId;
}
在此处传递此 ID:camera=Camera.open(getFrontCameraId());
我收到异常 java.lang.RuntimeException: Fail to get camera info
在 Camera.getCameraInfo(cameraId,info);
我的代码是:
public void surfaceCreated(SurfaceHolder holder) {
int cameraId = -1;
for(int i=0;i<Camera.getNumberOfCameras();i++){
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(cameraId,info);
if(info.facing== Camera.CameraInfo.CAMERA_FACING_FRONT){
cameraId = i;
break;
}
}
camera = Camera.open(cameraId);
}
和清单还有:
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.front" />
<uses-feature android:name="android.hardware.camera.autofocus" />
缺少什么东西,我该如何解决? 欢迎任何帮助。
您遇到异常是因为您将 cameraId 初始化为 -1,这是错误的。 并传递它以获取相机信息
Camera.getCameraInfo(cameraId,info);
将 cameraId 初始化为 0 以消除异常。
我改变了方法;之前我正在实施 SurfaceHolder.Callback
但现在我创建了它的对象。
我将代码从 SurfaceCreated
移到了 onResume()
public void onResume() {
super.onResume();
for(int i=0;i<Camera.getNumberOfCameras();i++){
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(i,info);
if(info.facing== Camera.CameraInfo.CAMERA_FACING_FRONT){
cameraId = i;
break;
}
}
camera=Camera.open(cameraId);
camera.startPreview();
}
回调的对象是这样的:
SurfaceHolder.Callback surfaceCallback=new SurfaceHolder.Callback() {
public void surfaceCreated(SurfaceHolder holder) {
// no-op -- wait until surfaceChanged()
}
public void surfaceChanged(SurfaceHolder holder,
int format, int width,
int height) {
Camera.Parameters parameters=camera.getParameters();
Camera.Size size=getBestPreviewSize(width, height,
parameters);
Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
if (size!=null) {
parameters.setPreviewSize(size.width, size.height);
camera.setParameters(parameters);
camera.setDisplayOrientation(90);
cameraConfigured=true;
}
camera.startPreview();
}
public void surfaceDestroyed(SurfaceHolder holder) {
// no-op
}
};
这解决了我的问题。
此方法将return前置摄像头ID:
private int getFrontCameraId(){
int camId = -1;
int numberOfCameras = Camera.getNumberOfCameras();
Camera.CameraInfo ci = new Camera.CameraInfo();
for(int i = 0;i < numberOfCameras;i++){
Camera.getCameraInfo(i,ci);
if(ci.facing == Camera.CameraInfo.CAMERA_FACING_FRONT){
camId = i;
}
}
return camId;
}
在此处传递此 ID:camera=Camera.open(getFrontCameraId());