1

我用这个脚本打开了前置摄像头:

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());
        }
    }
}

我认为这个脚本应该选择并打开所有设备上的前置摄像头。但是在我的设备上,脚本只能在带有两个摄像头(前置 + 后置摄像头)的设备上正常工作。在带有一个前置摄像头的其他设备上,我只收到空白屏幕。仅使用一个前置摄像头访问摄像头有什么区别吗?

4

2 回答 2

1

“在其他带有一个前置摄像头的设备上,我只收到空白屏幕。”

通过“仅接收空白屏幕”,您是指来自相机预览吗?通过调用打开相机Camera.open(cameraId)不会自动为您提供预览屏幕。有关启动相机预览的示例,请参阅示例教程中的startPreview()方法。

此外,请确保您的设备没有任何硬件问题(通过在 stock-camera 应用程序上进行测试来确认您的代码,以查看是否成功打开相机预览或在其他设备上)。

“但在我的设备上,脚本只能在带有两个摄像头(前置 + 后置摄像头)的设备上正常工作。”

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()并在需要时调用其关联的方法。

于 2013-03-14T23:14:21.293 回答
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;
}
于 2013-03-15T13:20:11.250 回答