4

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

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

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

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

4

2 回答 2

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 源代码中提供了有关它们的更多详细信息

于 2014-11-28T15:01:19.290 回答
3

谷歌的文档远远领先于他们在这里的实施。我浏览了代码存储库(似乎是 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().

于 2011-09-29T03:10:30.187 回答