android Camera如何判断当前使用的摄像头是前置还是后置

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android Camera如何判断当前使用的摄像头是前置还是后置相关的知识,希望对你有一定的参考价值。

现在 android 平台的智能手机一般都标配有两颗摄像头。在 Camera 中都存在摄像头切换的功能。
并且有一些功能前后置摄像头上会有所不同。譬如人脸检测,人脸识别,自动对焦,闪光灯等功能,
如果前置摄像头的像素太低,不支持该功能的话,就需要在前置摄像头上关掉该 feature.

那么是如何判断并切换前后置摄像头的呢?
我们先来看下 CameraInfo 这个类,

[java] view plaincopy
/**
* Information about a camera
*/
public static class CameraInfo
/**
* The facing of the camera is opposite to that of the screen.
*/
public static final int CAMERA_FACING_BACK = 0;

/**
* The facing of the camera is the same as that of the screen.
*/
public static final int CAMERA_FACING_FRONT = 1;

/**
* The direction that the camera faces. It should be
* CAMERA_FACING_BACK or CAMERA_FACING_FRONT.
*/
public int facing;

/**
* The orientation of the camera image. The value is the angle that the
* camera image needs to be rotated clockwise so it shows correctly on
* the display in its natural orientation. It should be 0, 90, 180, or 270.

*
*
For example, suppose a device has a naturally tall screen. The
* back-facing camera sensor is mounted in landscape. You are looking at
* the screen. If the top side of the camera sensor is aligned with the
* right edge of the screen in natural orientation, the value should be
* 90. If the top side of a front-facing camera sensor is aligned with
* the right of the screen, the value should be 270.
*
* @see #setDisplayOrientation(int)
* @see Parameters#setRotation(int)
* @see Parameters#setPreviewSize(int, int)
* @see Parameters#setPictureSize(int, int)
* @see Parameters#setJpegThumbnailSize(int, int)
*/
public int orientation;
;

见名知义,它就是一个 Camera 信息类。它是通过与屏幕的方向是否一致来定义前后置摄像头的。

与屏幕方向相反即为 BACK_FACING_CAMERA
与屏幕方向一致即为 FRONT_FACING_CAMERA
那么在代码中我们是如何获取当前使用的 CamerInfo 呢

[java] view plaincopy
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(cameraId, info);
当然,使用该代码的前提是要 import android.hardware.Camera.CameraInfo;

判断使用是前置还是后置摄像头,可以通过if (info.facing == CameraInfo.CAMERA_FACING_FRONT) 来判断。
当Camera 的实例已经创建了的情况下,则需要通过如下方式来判断。

[java] view plaincopy
CameraInfo info = CameraHolder.instance().getCameraInfo()[mCameraId];
if (info.facing == CameraInfo.CAMERA_FACING_FRONT)
//stopFaceDetection();


也可以通过 if(mCameraId == CameraInfo.CAMERA_FACING_FRONT) 来判断。
其中 mCameraId 是当前使用的 CameraId, 一般前置为1, 后置为 0。
参考技术A 大多数的相机程序都使用横向拍照,这也是摄像头传感器的自然方向。但是这并不影响您在竖屏的时候拍照,设备的方向信息会存储到图片的EXIF信息中。可以通过函数setCameraDisplayOrientation()来改变预览的显示方向而不影响图片的保存数据。然而,在APIlevel14之前的版本中,在修改预览方向之前需要先停止预览窗口然后重新启动预览。 参考技术B -
可以通过:
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(cameraId, info);
判断使用是前置还是后置摄像头,可以通过if (info.facing == CameraInfo.CAMERA_FACING_FRONT) 来判断
如果是已经打开的camera实例的话,可以通过
CameraInfo info = CameraHolder.instance().getCameraInfo()[mCameraId];
if(mCameraId == CameraInfo.CAMERA_FACING_FRONT) 来判断

Android Camera2前置摄像头

【中文标题】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 Camera如何判断当前使用的摄像头是前置还是后置的主要内容,如果未能解决你的问题,请参考以下文章

android Camera如何判断当前使用的摄像头是前置还是后置

Android Camera2前置摄像头

Android USB摄像头插拔监听

Android Camera2 开发详解

Android——camera摄像头

Android——camera摄像头