安卓Camera2前置摄像头

18

我最近注意到相机API已经被弃用,而且我找到了名为Camera2的新API。

我已经阅读了文档,但是我并不真正理解它。

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

只需要预览,不需要录制。

我想使用这个新的API,因为我猜测未来当前的相机API将会被取代并停止工作。

所以我想要有所准备,坐视每个人恐慌。XD

4个回答

27

首先,找出你前置摄像头的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


15

0表示后置摄像头,1表示前置摄像头

对于后置摄像头,在openCamera方法中需要执行以下代码:

cameraId = manager.getCameraIdList()[0];

对于前置摄像头,在openCamera方法中需要添加以下代码:

cameraId = manager.getCameraIdList()[1];

我已经将所有的代码和截图添加到这里

enter image description here


如果您查看源代码 public static final int LENS_FACING_BACK = 1; -_- - Cyph3rCod3r
此答案应该被删除,因为它指向了虚假的外部资源。 - user2587965
1
@francogrex 感谢您指出。请查看此链接 https://justpaste.it/3a970 - Stephen

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。

0

两个链接都无法使用。 - Rishi Bhatnagar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接