Android Camera2前置摄像头
Android Camera2 front camera
我最近注意到相机 API 已弃用,我发现新的 API 称为 Camera2。
我已经阅读了文档,但我不是很明白。
所以我的问题是:如何使用新摄像头预览前置摄像头api?
只是预览,不是录制。
我想用这个新的 API 因为我猜将来当前的相机 API 将被替换并停止工作。
所以我想做好准备,在每个人都恐慌的时候坐着看。 XD
首先,找出你的前置摄像头的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
0 表示返回
1 个用于前面
对于 Back 相机,我们必须在 openCamera 方法中执行此操作:
cameraId = manager.getCameraIdList()[0];
对于 Front 摄像头,我们必须在 openCamera 方法中添加以下行:
cameraId = manager.getCameraIdList()[1];
我已经添加了所有的代码和截图here
我使用了 Google Camera2 API 示例中的代码并进行了一些更改以使前后摄像头正常工作,包括在本地保存图像并通过使用覆盖更改 TextureView 的形状.
我也使用 exif 接口处理图像旋转。
有很多代码,所以我要 post 一个 link 到我的 GitHub 仓库:
我们可以得到我们设备中摄像头的特征
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
我最近注意到相机 API 已弃用,我发现新的 API 称为 Camera2。
我已经阅读了文档,但我不是很明白。
所以我的问题是:如何使用新摄像头预览前置摄像头api?
只是预览,不是录制。
我想用这个新的 API 因为我猜将来当前的相机 API 将被替换并停止工作。
所以我想做好准备,在每个人都恐慌的时候坐着看。 XD
首先,找出你的前置摄像头的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
0 表示返回 1 个用于前面
对于 Back 相机,我们必须在 openCamera 方法中执行此操作:
cameraId = manager.getCameraIdList()[0];
对于 Front 摄像头,我们必须在 openCamera 方法中添加以下行:
cameraId = manager.getCameraIdList()[1];
我已经添加了所有的代码和截图here
我使用了 Google Camera2 API 示例中的代码并进行了一些更改以使前后摄像头正常工作,包括在本地保存图像并通过使用覆盖更改 TextureView 的形状.
我也使用 exif 接口处理图像旋转。
有很多代码,所以我要 post 一个 link 到我的 GitHub 仓库:
我们可以得到我们设备中摄像头的特征
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