getSensorList() против getDefaultSensor() в Android SensorManager

Я пишу игру для Android и хочу иметь возможность использовать акселерометр для ввода.

Я вижу два способа получить датчик, один из них заключается в использовании первого элемента SensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER) а другой SensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),

getDefaultSensor Док говорит, что он может вернуть "составной" датчик, поэтому, если я хочу "сырой" датчик, я должен использовать getSensorList,

Любая идея, в чем разница между композитным или необработанным датчиком? Это относится даже к акселерометру? Кто-нибудь имеет опыт работы с устройствами, которые содержат несколько или составные акселерометры? (Или какой-то другой датчик?)

2 ответа

Решение

Документация Google намного опережает их реализацию здесь. Я просмотрел репозиторий кода (который, похоже, является исходным кодом 2.3.1) и обнаружил:

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(),

Обновление: они обновили метод getDefaultSensor в Lollipop, и теперь есть разница:

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, так как они предназначены для использования только для пользовательского интерфейса системы. Более подробная информация о них содержится в источнике Sensor.java.

Другие вопросы по тегам