2011-09-27 337 views
4

我正在为Android编写游戏,并希望能够使用加速度计进行输入。Android SensorManager中的getSensorList()与getDefaultSensor()

我看到两种获取传感器的方法,一种方法是使用SensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER)的第一个元素,另一种方法是SensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)

getDefaultSensor doc说它可能会返回一个“复合”传感器,所以如果我想要一个“原始”传感器,我应该使用getSensorList

任何想法复合或原始传感器之间的区别是什么?这甚至适用于加速度计吗?任何人都有使用包含多个或复合加速度计的设备的经验? (或者其他一些传感器?)

回答

3

谷歌的文档比他们在这里的实现领先。我通过code repository浏览(这似乎是2.3.1-ISH源),并发现:

public Sensor getDefaultSensor(int type) { 
    // TODO: need to be smarter, for now, just return the 1st sensor 
    List<Sensor> l = getSensorList(type); 
    return l.isEmpty() ? null : l.get(0); 
} 

所以没有真正的区别(我不认为他们真的可以添加一个更高版本)的传感器之间从getDefaultSensor()getSensorList()返回。

+0

不再更新。见下文。 –

3

更新: 他们在棒棒糖更新getDefaultSensor方法,现在是有区别的:

public Sensor getDefaultSensor(int type) { 
    // TODO: need to be smarter, for now, just return the 1st sensor 
    List<Sensor> l = getSensorList(type); 
    boolean wakeUpSensor = false; 
    // For the following sensor types, return a wake-up sensor. These types are by default 
    // defined as wake-up sensors. For the rest of the SDK defined sensor types return a 
    // non_wake-up version. 
    if (type == Sensor.TYPE_PROXIMITY || type == Sensor.TYPE_SIGNIFICANT_MOTION || 
      type == Sensor.TYPE_TILT_DETECTOR || type == Sensor.TYPE_WAKE_GESTURE || 
      type == Sensor.TYPE_GLANCE_GESTURE || type == Sensor.TYPE_PICK_UP_GESTURE) { 
     wakeUpSensor = true; 
    } 

    for (Sensor sensor : l) { 
     if (sensor.isWakeUpSensor() == wakeUpSensor) return sensor; 
    } 
    return null; 
} 

因此,如果有可用的指定类型的多个传感器,getDefaultSensor会返回一个非唤醒版本(除非默认类型是上述那些实际上6定义为唤醒传感器中的一个)

顺便提一下,Sensor.TYPE_TILT_DETECTOR,Sensor.TYPE_WAKE_GESTURE,Sensor.TYPE_GLANCE_GESTURE和Sensor.TYPE_PICK_UP_GESTURE都隐藏在SDK,因为它们旨在仅用于系统UI。 Sensor.java源代码中有更多详细信息