【问题标题】:Android/Java: detect if device has a BACK CameraAndroid/Java:检测设备是否有后置摄像头
【发布时间】:2014-09-29 19:47:42
【问题描述】:

如何检测设备背面是否有摄像头?

这是我检测设备是否有手电筒的代码:

if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH) 
    || (_camera.getParameters().getSupportedFlashModes() != null)) hasFlashlight = true;
else hasFlashlight = false;

但即使设备只有前置摄像头没有手电筒,它也是TRUE

【问题讨论】:

  • 这个 SO 答案应该适合你:stackoverflow.com/questions/14399333/…
  • 顺便说一句,我可以使用Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK); 来打开 BACK 摄像头吗?
  • "我可以使用 Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK); 来打开 BACK 相机吗?" -- 不,因为open() 的参数不是CAMERA_FACING_BACK 之类的属性。

标签: java android camera


【解决方案1】:

对于 API >= 9:您可以将 Camera.getCameraInfo 用于类似这样的内容:

int backCameraId = -1;
for(int i=0;i<Camera.getNumberOfCameras();i++){
    CameraInfo cameraInfo = new CameraInfo();
    Camera.getCameraInfo(i,cameraInfo);
    if(cameraInfo.facing==CameraInfo.CAMERA_FACING_BACK) {
        backCameraId = i;
        break;
    }
}
Log.d(TAG, "back camera exists ? "+(backCameraId>-1));
Log.d(TAG, "back camera id  :"+backCameraId);

对于 API >= 21,建议您使用Camera2 API:

String backCameraId = null;
CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
for(String cameraId:manager.getCameraIdList()){
    CameraCharacteristics cameraCharacteristics = manager.getCameraCharacteristics(cameraId);
    Integer facing = cameraCharacteristics.get(CameraCharacteristics.LENS_FACING);
    if(facing==CameraMetadata.LENS_FACING_BACK) {
        backCameraId = cameraId;
        break;
    }
}
Log.d(TAG, "back camera exists ? "+(backCameraId!=null));
Log.d(TAG, "back camera id  :"+backCameraId);

【讨论】:

  • 我可以在 Android 2.2 中通过@SuppressLint 或@TargetApi 使用这些代码吗?
  • 此代码需要 API 9+ (2.2.3) 请注意,Android 2.2 约占市场的 0.7% (developer.android.com/about/dashboards/index.html)。所以如果你真的需要 2.2 的兼容性,你需要保护这段代码(见这个:developer.android.com/training/basics/supporting-devices/…
  • 太棒了!我只需在 backCameraId = i; 行之后添加 break; 并将“camera id :”替换为 “camera index :”
  • 请注意,Camera 类已被弃用,取而代之的是 android.hardware.camera2 API
【解决方案2】:

尝试检查相机的数量:

import android.hardware.Camera;

int numberOfCameras = Camera.getNumberOfCameras();

如果大于 1,则可以肯定有后置摄像头。

【讨论】:

  • 谢谢,但getNumberOfCameras() 不适用于 Android 2.2 或更低版本...(“找不到符号”)
  • @YoushaAleayoub:Android 2.2 及更早版本不支持前置摄像头。因此,在这些设备上,如果它有一个摄像头,它就是一个后置摄像头。话虽如此,不要仅仅假设摄像头的数量表明一个摄像头是否朝后——在另一个答案中使用 ben75 的方法。
  • @YoushaAleayoub 如果您需要它在 Android 2.2 及更早版本上运行,那么您应该将其添加到您的问题中。 Android 2.3 确实是大多数开发人员关心的最古老的版本。
  • 谢谢大家,“如果大于 1,肯定有后置摄像头。”表示getNumberOfCameras() 将首先检查 FrontCamera?
  • 在只有一个后置摄像头的设备上错过后置摄像头的风险很大。这个解决方案是非常错误的。
【解决方案3】:
public boolean isRearCameraAvailable(Context context) {
    return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA);
}

检查设备是否有背对设备用户的摄像头

【讨论】:

    【解决方案4】:
    CameraManager mCameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
    
     /** Which way the camera is facing. */
        public static enum Facing {
            FRONT, BACK;
        }
    
     /** Returns the ID of the first camera facing the given direction. */
        private String findCameraId(Facing facing) {
            if (facing == Facing.FRONT) {
                return findFirstFrontCameraId();
            } else {
                return findFirstBackCameraId();
            }
        }
    
        /** Returns the ID of the first back-facing camera. */
        private String findFirstBackCameraId() {
            Log.d(TAG, "Getting First BACK Camera");
            String cameraId = findFirstCameraIdFacing(CameraCharacteristics.LENS_FACING_BACK);
            if (cameraId == null) {
                Log.w(TAG, "No back-facing camera found.");
            }
            return cameraId;
        }
    
        /** Returns the ID of the first front-facing camera. */
        private String findFirstFrontCameraId() {
            Log.d(TAG, "Getting First FRONT Camera");
            String cameraId = findFirstCameraIdFacing(CameraCharacteristics.LENS_FACING_FRONT);
            if (cameraId == null) {
                Log.w(TAG, "No front-facing camera found.");
            }
            return cameraId;
        }
    
    
        /** Returns the ID of the first camera facing the given direction. */
        private String findFirstCameraIdFacing(int facing) {
            try {
                String[] cameraIds = mCameraManager.getCameraIdList();
                for (String cameraId : cameraIds) {
                    CameraCharacteristics characteristics = mCameraManager
                          .getCameraCharacteristics(cameraId);
                    if (characteristics.get(CameraCharacteristics.LENS_FACING) == facing) {
                        return cameraId;
                    }
                }
            } catch (CameraAccessException ex) {
                Log.w(TAG, "Unable to get camera ID", ex);
            }
            return null;
        }
    

    【讨论】:

      猜你喜欢
      • 2010-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-03
      • 1970-01-01
      • 2015-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多