Detecting camera features with Camera2

使用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开发新的相机应用程序。

猜你喜欢

转载自blog.csdn.net/u014011112/article/details/54148993
今日推荐