使用Camera2检测相机功能(Detecting camera features with Camera2)
原文链接:https://medium.com/google-developers/detecting-camera-features-with-camera2-61675bb7d1bf#.ks8l788lx
我手机的相机有它自己的特性。它有闪光灯,连拍,甚至有内置的降噪点。开发者可以使用这些有优势的个性化功能来提供更好的照片应用。但是,并不是所有相机都一样的,有些可能缺少上述的功能。作为一个开发者,如何知道哪些功能能用哪些不能用?Camera2告诉你。
为什么要用Camera2?(Why Camera2)
Camera2 API 在Android L 中引入,它是原始Camera API接口的后继者。
Camera2适用于那些需要直接访问设备相机的照片应用。如果相机仅仅是你应用程序体验上的一个附属功能,那么使用Camera Intent的方式就足够了。但是,如果你的应用需要自定义相机的体验,那么Camera2 API是一个不错的选择。
Camera2沿用了它原始接口的一些优点:
在新硬件上提升性能。
拍照的的间隔时间更快
显示多个相机的预览
直接应用效果和过滤器
另外一些值得注意的优点,你现在可以查询API来检测相机所需的功能。
使用Camera2禁用自身(Banning Selfies with Camera2)
现在,让我们假设你正在编译一个反自拍的照片应用。如果用户尝试翻转前置摄像头,你将发送一个Toast,让他们知道你的应用没有这个功能。
Camera2 API会告诉你是否存在前置摄像头,不过首先你需要先获取设备上可用的相机列表。
Step1:获取Camera(Get a Camera)
Camera2 API的核心就是CameraManager类。你可以通过CameraManager使用getCameraIdList()获取相机的字符串数组id。相机的id代表设备上可用的相机。使用getCameraCharactertics()方法,可以传入相机的id并获取设备可用的设置和输出的参数。
CameraManager manager =
(CameraManager)getSystemService(CAMERA_SERVICE);
try {
for (String cameraId : manager.getCameraIdList()) {
CameraCharacteristics chars
= manager.getCameraCharacteristics(cameraId);
// Do something with the characteristics
} catch (CameraAccessException e) {
e.printStackTrace();
}
获取相机的特性之后,你就可以准备查询了。
Step2:查询特性(Query the characteristics)
一旦你获取CameraCharacteristics对象,你就可以查询设备上可用的特性。 get() 方法需要传入一个CameraCharacteristic域,然后返回这个域对应的值。
// Does the camera have a forwards facing lens?
Integer facing = chars.get(CameraCharacteristics.LENS_FACING);
Step3:禁用自身(Ban Selfies)
facing变量仅仅只是一个整数。你如何知道相机镜头实际所面对的方向呢?这个整数代表一个 CameraMetadata常量。使用 LENS_FACING_FRONT 常量,你可以检测摄像头是否对着脸部。
private void detectSelfieCamera(String cameraId) {
CameraCharacteristics chars
= manager.getCameraCharacteristics(cameraId);
// Does the camera have a forwards facing lens?
Integer facing = chars.get(CameraCharacteristics.LENS_FACING);
if (facing != null && facing ==
CameraCharacteristics.LENS_FACING_FRONT) {
// No selfies!
Context context = getApplicationContext();
CharSequence text = “No selfie for you! Turn the camera around”;
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(context, text, duration)
toast.show();
// don’t process anything for the front facing camera
continue;
} else {
// Open the rear facing camera (see github repo below)
}
}
任务完成。现在任何自拍都会弹出一个提示,让用户知道你的应用并不支持前置摄像头的使用。
检测其他功能(Detecting other features)
使用这个API还能检测什么功能呢?很多,这里有78种CameraCharacteristics,所以,所以这里有相当多的功能可以探索。
FLASH_INFO_AVAILABLE: 相机是否有闪光灯?
REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE: 相机能否拍摄大于20fps的高分辨率照片?然后你才能添加连拍模式。
JPEG_AVAILABLE_THUMBNAIL_SIZES: 设备支持什么JPEG缩略图的尺寸?
Camera2 on Github
如果你准备要更深的了解Camera2,Github官方的示例是一个非常不错的开始。示例有更进一步的介绍,包括如何显示相机预览和拍照。
准备好使用Camera2 API开发新的相机应用程序。