我用这个脚本打开前脸摄像头:
private Camera openFrontFacingCameraGingerbread() {
int cameraCount = 0;
Camera cam = null;
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
cameraCount = Camera.getNumberOfCameras();
for ( int camIdx = 0; camIdx < cameraCount; camIdx++ ) {
Camera.getCameraInfo( camIdx, cameraInfo );
if ( cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
try {
cam = Camera.open(camIdx);
} catch (RuntimeException e) {
Log.e(TAG, "Camera failed to open: " + e.getLocalizedMessage());
}
}
}
我认为这个脚本应该在所有设备上选择并打开前置摄像头。 但在我的设备上,脚本只能在带有两个摄像头(前置+后置摄像头)的设备上正常工作。在带有一个前置摄像头的其他设备上,我只收到空白屏幕。仅使用一台前置摄像头访问摄像机有什么不同吗?
答案 0 :(得分:1)
“在有一台前置摄像头的其他设备上,我只收到空白屏幕。”
通过“只接收空白屏幕”,您的意思是Camera Preview吗?通过拨打Camera.open(cameraId)
打开相机不会自动为您提供预览屏幕。有关启动相机预览的示例,请参阅this示例教程中的startPreview()
方法。
此外,请确保您的设备没有任何硬件问题(通过在相机应用程序上测试确认您的代码,以查看是否成功打开相机预览或在不同的设备上)。
“但在我的设备上,脚本仅在具有两个设备的设备上正常工作 相机(前置+后置摄像头)。“
camIdx
和cameraCount
的值有效且符合预期;因此,它应该正常工作。无论设备具有的摄像头总数如何,您在问题中仅提供的代码都会打开前置摄像头,评估您的代码:
如果您有一台相机:
cameraCount = Camera.getNumberOfCameras(); // cameraCount == 1
// in for loop
cam = Camera.open(camIdx); // camIdx == 0
如果您有两台相机:
cameraCount = Camera.getNumberOfCameras(); // cameraCount == 2
// ... more codes
// in for loop
cam = Camera.open(camIdx); // camIdx == 1
“仅使用一台前置摄像头访问摄像机有什么不同吗?” *
在处理具有不同规格的不同设备时,调用Camera对象及其相关方法应该没有任何区别。就Android应用程序开发而言,我们所需要的只是通过调用Camera.CameraInfo
来检索Camera.CameraInfo()
对象,并在需要时调用其关联的方法。
答案 1 :(得分:0)
此方法应该为您提供最前端的相机。如果该设备只有一个后置摄像头,你就可以得到那个。如果有两个,你会得到前面一个。如果前面只有一个,你会得到那个:
private Camera getCameraInstance() {
Camera c = null;
try {
// get the front-est camera
c = Camera.open(Camera.getNumberOfCameras() - 1);
} catch (Exception e) {
Log.d(TAG, "Couldn't get the camera");
}
return c;
}