安卓/Java:如何检测设备是否有后置摄像头

9

如何检测设备是否有后置摄像头?

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

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

即使设备只有前置摄像头而没有闪光灯,这也是真实的


这个SO答案应该适合你:https://dev59.com/0m3Xa4cB1Zd3GeqPd196 - Alboz
顺便问一下,我能否使用Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);只打开后置相机? - Yousha Aleayoub
1
“我可以使用Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);来打开后置摄像头吗?” -- 不行,因为open()方法的参数不是像CAMERA_FACING_BACK这样的属性。 - CommonsWare
4个回答

22

对于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:


For API >= 21, it is recommended to use the 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来使用这些代码吗? - Yousha Aleayoub
1
此代码需要API 9+(2.2.3)。请注意,Android 2.2市场份额约为0.7%(https://developer.android.com/about/dashboards/index.html)。因此,如果您真的需要2.2兼容性,则需要保护此代码(请参见:http://developer.android.com/training/basics/supporting-devices/platforms.html)。 - ben75
太好了!我只需要在 backCameraId = i; 行后添加 **break;**,并将 "camera id :" 替换为 **"camera index :"**。 - 1111161171159459134
1
请注意,Camera类已被弃用,建议使用android.hardware.camera2 API。 - eliasbagley

1
尝试检查摄像机的数量:
import android.hardware.Camera;

int numberOfCameras = Camera.getNumberOfCameras();

如果大于1,很有可能会有一个后置摄像头。

1
谢谢,但是getNumberOfCameras()不适用于Android 2.2或更低版本...(“找不到符号”) - Yousha Aleayoub
5
Android 2.2及之前的版本不支持前置摄像头,因此在这些设备上,如果有摄像头,则为后置摄像头。话虽如此,请不要仅仅假定摄像头数量表示其是否为后置摄像头--请使用ben75在另一个答案中提到的方法。 - CommonsWare
3
如果您需要它在Android 2.2及更早版本上运行,那么您应该在问题中加入这个要求。Android 2.3是大多数开发者关心的最老版本。 - Intrications
1
谢谢你们两位。"如果返回值大于1,那么就很有可能有后置摄像头"的意思是getNumberOfCameras()首先会检查前置摄像头吗? - Yousha Aleayoub
1
在只有一个后置摄像头的设备上,错过后置摄像头的风险非常大。这种解决方案是非常错误的。 - ben75

0
public boolean isRearCameraAvailable(Context context) {
    return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA);
}

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


0
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;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接