对于 Android API 2.1 及更高版本,我们可以使用上下文:
getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_AUTOFOCUS)
但是在 2.1 版本之前,我们如何进行同样的操作呢?有没有这样的事情不涉及调用Camera.open
then getParameters
?
List<String> supportedFocusModes = camera.getParameters().getSupportedFocusModes();
boolean hasAutoFocus = supportedFocusModes != null && supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)
我猜:不要使用未知常数。
getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_AUTOFOCUS)
应该:
getPackageManager().hasSystemFeature("android.hardware.camera.autofocus")
在这里使用常量是开发人员的短视。它解决了知道设备是否运行 API 的问题,该 API 知道某项功能是否具有某项功能。但是在您刚才提到的情况下失败了……它们确实使支持多个 api 级别变得困难。
更新:刚刚自己测试过... PackageManager.hasSystemFeature() 仅出现在 API 级别 5。我试图将该检查添加到我的代码中,该代码可以很好地支持 API 级别 3 (1.5),但可以从相机的自动功能中受益焦点...似乎我必须选择支持 1.5 或能够使用自动对焦...或将我的向后兼容性移至 5 级...或实现此http://www.java.net/forum/topic/ java-tools/java-development-tools/wwyt-conditional-compilation-pre-process ...是的,对。
它们确实使支持多个版本变得困难。非常抱歉 1.5 和 1.6 和 2.0 用户。因为我的设备是 2.2,这将是我的底线。
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]));
}
}
API Level 5 中添加了许多 Camera.Parameters 类的方法(我相信映射到 Android 2.0),它们将返回支持的功能列表。在从 camera.getParameters() 检索的 Camera.Parameters 对象上调用 getSupportedFocusModes
http://developer.android.com/reference/android/hardware/Camera.Parameters.html