Android Camera2前置摄像头
Posted
技术标签:
【中文标题】Android Camera2前置摄像头【英文标题】:Android Camera2 front camera 【发布时间】:2015-09-08 16:07:37 【问题描述】:我最近注意到相机 API 已被弃用,我发现了名为 Camera2 的新 API。
我已经阅读了文档,但我不是很明白。
所以我的问题是:如何使用新的摄像头 api 预览前置摄像头?
只是预览,不是录制。
我想使用这个新 API,因为我猜将来当前的 Camera API 将被替换并停止工作。
所以我想做好准备,在每个人都惊慌失措的时候坐下来观看。呵呵
【问题讨论】:
【参考方案1】:首先,找出你的前置摄像头的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
【讨论】:
【参考方案2】:0 表示返回 1 代表正面
对于 Back 相机,我们必须在 openCamera 方法中执行此操作:
cameraId = manager.getCameraIdList()[0];
对于面对 Front 摄像头,我们必须在 openCamera 方法中添加以下行:
cameraId = manager.getCameraIdList()[1];
我已经添加了所有代码和截图here
【讨论】:
如果你看源码public static final int LENS_FACING_BACK = 1; -_- 这个答案应该被删除,因为它指向错误的外部来源 @francogrex 感谢您指出这一点。请查看此链接justpaste.it/3a970【参考方案3】:我们可以得到我们设备中相机的特征
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
,所以根据这个值我们可以得到Frontal camera:
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。
【讨论】:
【参考方案4】:我使用 Google Camera2 API 示例中的代码进行了一些更改,以使前后摄像头正常工作,包括在本地保存图像并使用叠加层更改 TextureView 的形状。
我也使用 exif 接口处理图像旋转。
代码有点多,所以我将发布一个指向我的 GitHub 存储库的链接:
https://github.com/craigspicer/Camera2API
https://nullparams.com/camera-2-api-tutorial/
【讨论】:
这两个链接都不起作用。以上是关于Android Camera2前置摄像头的主要内容,如果未能解决你的问题,请参考以下文章
Android 10(api 29)camera2 api回归与广角相机
使用后置摄像头的人脸检测无法使用 camera2 API 正常工作
android Camera如何判断当前使用的摄像头是前置还是后置