Android Camera2前置摄像头

时间:2015-09-08 16:07:37

标签: android android-5.0-lollipop android-camera2

我最近注意到不推荐使用Camera API,我找到了名为Camera2的新API。

我已阅读文档但我并不理解。

所以我的问题是:如何使用新的相机api预览前置摄像头?

只是预览,而非录制。

我想使用这个新API,因为将来我猜测当前的Camera API将被替换并停止工作。

所以我想做好准备,坐下来观看,每个人都会恐慌。 XD

4 个答案:

答案 0 :(得分:18)

首先,找出前置摄像头的ID(如果有的话)

    CameraManager manager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE);
            try {
                return manager.getCameraIdList();
            } catch (CameraAccessException e) {
                return null;
            }

然后找到像这样的faceCamera:

CameraCharacteristics cameraCharacteristics = manager.getCameraCharacteristics(cameraId);

        if (cameraCharacteristics == null)
            throw new NullPointerException("No camera with id " + cameraId);

        return cameraCharacteristics.get(CameraCharacteristics.LENS_FACING) == CameraCharacteristics.LENS_FACING_FRONT;

最后,您必须使用该ID设置相机:

CameraManager manager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE);
   try {
       characteristics = manager.getCameraCharacteristics(mCameraId);
   }  catch (CameraAccessException e) {
       e.printStackTrace();
   } 

注意,这些只是如何做你想做的事情的提示。 有关如何开始预览的详细信息,请参阅: http://developer.android.com/samples/Camera2Basic/index.html

答案 1 :(得分:5)

0表示返回 1为前面

对于返回相机,我们必须在 openCamera 方法中执行此操作:

  

cameraId = manager.getCameraIdList()[0];

对于面对相机,我们必须在 openCamera 方法中添加以下内容:

  

cameraId = manager.getCameraIdList()[1];

我添加了所有代码和屏幕截图here

enter image description here

答案 2 :(得分:1)

我们可以在设备中获取摄像机的特征

   private void getCameraCharacteristics (){
       try {
       CameraManager manager=(CameraManager)getSystemService(Context.CAMERA_SERVICE);
           for(String id : manager.getCameraIdList()){
               Log.e(TAG, "Camara: Id " + id );
               CameraCharacteristics cameraCharacteristics = manager.getCameraCharacteristics(id);
               List<CameraCharacteristics.Key<?>> listaCaracteristicas = cameraCharacteristics.getKeys();
               for(CameraCharacteristics.Key<?> caracteristica : listaCaracteristicas){
                   Log.i(TAG,  "caracteristic: " + caracteristica.getName()  + " : " + cameraCharacteristics.get(caracteristica));
               }
               Log.i(TAG, listaCaracteristicas.toString());
           }
       } catch (CameraAccessException e) {
           e.printStackTrace();
       }

   }

其中一个特征是android.lens.facing,因此基于此值,我们可以得到前置摄像头:

 if(cameraCharacteristics.get(CameraCharacteristics.LENS_FACING) == CameraCharacteristics.LENS_FACING_FRONT){
              //Frontal camera
  }

这是获取此值的方法:

private String getIdFrontalCamera () {
    try {
        CameraManager manager=(CameraManager)getSystemService(Context.CAMERA_SERVICE);
        for(String id : manager.getCameraIdList()){
            CameraCharacteristics cameraCharacteristics = manager.getCameraCharacteristics(id);
            //Seek frontal camera.
            if(cameraCharacteristics.get(CameraCharacteristics.LENS_FACING) == CameraCharacteristics.LENS_FACING_FRONT){
                Log.i(TAG, "Camara frontal id " + id);
                return id;
            }
        }
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
    return "0";
}

大多数情况下,前置摄像头的ID为1。

答案 3 :(得分:0)

我使用Google Camera2 API示例中的代码进行了一些更改,以使前后摄像头正常工作,包括在本地保存图像以及通过使用覆盖层更改TextureView的形状。

我也使用exif界面处理图像旋转。

有很多代码,所以我将发布指向我的GitHub存储库的链接:

https://github.com/craigspicer/Camera2API

https://nullparams.com/camera-2-api-tutorial/