Android 安卓:检查相机是否支持自动对焦?
对于Android API 2.1版及更高版本,我们可以使用上下文:Android 安卓:检查相机是否支持自动对焦?,android,camera,autofocus,Android,Camera,Autofocus,对于Android API 2.1版及更高版本,我们可以使用上下文: getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_AUTOFOCUS) 但在2.1版之前,我们如何执行相同的操作?有没有类似的方法不需要调用摄像头。打开然后获取参数?摄像头有很多方法。在API级别5中添加的参数类(我相信映射到Android 2.0)将返回支持的功能列表。在Camera.Parameters对象上调用getSupportedF
getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_AUTOFOCUS)
但在2.1版之前,我们如何执行相同的操作?有没有类似的方法不需要调用
摄像头。打开然后获取参数?摄像头有很多方法。在API级别5中添加的参数类(我相信映射到Android 2.0)将返回支持的功能列表。在Camera.Parameters对象上调用getSupportedFocusModes,该对象从Camera.getParameters()检索
我猜:不要使用未知常量
getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_AUTOFOCUS)
应该是:
getPackageManager().hasSystemFeature("android.hardware.camera.autofocus")
开发人员在这里使用常量是短视的。它解决了一个问题,即运行一个了解某个特性的API的设备是否具有某个特性。但是你刚才提到的案子失败了。。。它们确实使支持多个api级别变得困难
更新:我自己刚测试过。。。PackageManager.hasSystemFeature()仅在API级别5出现。我试图在我的代码中添加这个检查,它可以很好地支持API级别3(1.5),但它可以从相机的自动对焦中受益…似乎我必须选择支持1.5或能够使用自动对焦。。。或者将我的向后兼容性提升到5级。。。或者实施这个……是的,对
它们确实使支持多个版本变得困难。非常抱歉1.5、1.6和2.0用户。因为我的设备在2.2上,这将是我的底线。列出支持的FocusModes=camera.getParameters().getSupportedFocusModes();
List<String> supportedFocusModes = camera.getParameters().getSupportedFocusModes();
boolean hasAutoFocus = supportedFocusModes != null && supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)
布尔hasaautofocus=supportedFocusModes!=null&&supportedFocusModes.contains(Camera.Parameters.FOCUS\u MODE\u AUTO)
专用void GetSupportedFocusedModes(摄像头)
{
final Camera.Parameters=Camera.getParameters();
列出supportedFocusModes=参数。getSupportedFocusModes();
LogUtils.infoMsg(“supportedFocusModes”+supportedFocusModes);
用于(字符串模式:supportedFocusModes){
LogUtils.infoMsg(“supportedFocusModes”+模式);
}
}
CameraManager CameraManager=(android.hardware.camera2.CameraManager)getSystemService(CAMERA_服务);
int[]afModes=cameraManager.getCameraCharacteristics(“0”).get(CameraCharacteristics.CONTROL\u AF\u AVAILABLE\u MODES);
如果(afModes.length)我相信他想知道android 1.5之类的。是的,但你必须先调用Camera.open,我不想这样做?我想要的只是一个简单的方法来获取手机摄像头是否支持自动聚焦“未知常数”的信息很好,因为它将在编译时内联。所以它将相当于您的“应该”在.class/.dex文件中。运行lint——在Android SDK的tools
文件夹中显示InlinedApi
以了解更多信息。hasSystemFeature
是内联不受影响的地方之一。请注意,这不允许您指定哪个摄像头,有些设备只在前向摄像头上自动对焦,而不是在后向摄像头上自动对焦一个。
private void getSuppourtedFocusedModes(Camera camera)
{
final Camera.Parameters parameters = camera.getParameters();
List<String> supportedFocusModes = parameters.getSupportedFocusModes();
LogUtils.infoMsg("supportedFocusModes " + supportedFocusModes);
for (String mode : supportedFocusModes) {
LogUtils.infoMsg("supportedFocusModes " + mode);
}
}
CameraManager cameraManager = (android.hardware.camera2.CameraManager) getSystemService(CAMERA_SERVICE);
int[] afModes = cameraManager.getCameraCharacteristics("0").get(CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES);
if (afModes.length <= 1)
{Log.d(TAG, "Camera doesn't have autofocus");}
else
{Log.d(TAG, "Camera has autofocus");}
Log.d(TAG, "CONTROL_AF_AVAILABLE_MODES:");
for (int position : afModes) {
switch (afModes[position]) {
case 0:
Log.d(TAG, "CONTROL_AF_MODE_OFF (0)");
break;
case 1:
Log.d(TAG, "CONTROL_AF_MODE_AUTO (1)");
break;
case 2:
Log.d(TAG, "CONTROL_AF_MODE_MACRO (2)");
break;
case 3:
Log.d(TAG, "CONTROL_AF_MODE_CONTINUOUS_VIDEO (3)");
break;
case 4:
Log.d(TAG, "CONTROL_AF_MODE_CONTINUOUS_PICTURE (4)");
break;
case 5:
Log.d(TAG, "CONTROL_AF_MODE_EDOF (5)");
break;
default:
Log.d(TAG, String.valueOf(afModes[position]));
}
}