Android SensorManager中的getSensorList()与getDefaultSensor()

时间:2011-09-27 07:53:43

标签: android sensor sensormanager

我正在为Android编写游戏,并希望能够使用加速度计进行输入。

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

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

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

2 个答案:

答案 0 :(得分: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()返回的传感器之间没有真正的区别(我认为他们不能真正添加​​一个)。

答案 1 :(得分:3)

更新: 他们更新了Lollipop中的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源中有关于它们的更多细节