Android使用前置摄像头 - 兼容所有设备

时间:2013-03-14 22:35:44

标签: android camera device compatibility using

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

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

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

2 个答案:

答案 0 :(得分:1)

  

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

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

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

  

“但在我的设备上,脚本仅在具有两个设备的设备上正常工作   相机(前置+后置摄像头)。“

camIdxcameraCount的值有效且符合预期;因此,它应该正常工作。无论设备具有的摄像头总数如何,您在问题中仅提供的代码都会打开前置摄像头,评估您的代码:

如果您有一台相机:

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