2010-12-06 62 views
17

对于2.1和更高的Android的API版本,我们可以使用情境:Android:检查相机是否支持自动对焦?

getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_AUTOFOCUS) 

但是2.1版本之前,我们如何能够执行相同的操作?有没有这样的事情,不涉及调用Camera.open,然后getParameters

回答

0

在API Level 5中添加了一些Camera.Parameters类的方法(我相信这些方法会映射到Android 2.0),它将返回支持的功能列表。在Camera.Parameters呼叫getSupportedFocusModes对象从camera.getParameters()获取

http://developer.android.com/reference/android/hardware/Camera.Parameters.html

+1

我相信他想知道的是Android 1.5和这样。 – blindstuff 2010-12-06 16:40:34

+0

是的,但您必须首先调用Camera.open,而我不想?我想要的只是一个简单的方法来获取手机相机是否支持自动对焦的信息 – user441316 2010-12-06 16:47:01

6

我猜:不要使用不明不变。

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级......或者实施此http://www.java.net/forum/topic/java-tools/java-development-tools/wwyt-conditional-compilation-pre-process ......是的,没错。

他们真的很难支持多个版本。所以对不起1.5和1.6和2.0用户。因为我的设备在2.2版本上,这将是我的底线。

18
List<String> supportedFocusModes = camera.getParameters().getSupportedFocusModes(); 
boolean hasAutoFocus = supportedFocusModes != null && supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO) 
3
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); 
     } 
    } 
1
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])); 
      } 
     }