Android Sensors - Проблемы с получением значений датчика приближения и проблемы с использованием разных телефонов - PullRequest
1 голос
/ 23 февраля 2011

В прошлом мы занимались разработкой Android, но уже давно - хотим создать приложение, использующее датчики ориентации и приближения.итак ...

mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ALL) , SensorManager.SENSOR_DELAY_GAME);

Итак, настройте прослушиватель - прослушал все датчики - интересно, стоит ли мне просто слушать два?(это сэкономит батарею?)

Sensor mySensor = event.sensor;
    // if (mySensor.getType() != Sensor.TYPE_ORIENTATION) return;
    if (mySensor.getType() == Sensor.TYPE_ORIENTATION)
    {
        float x = event.values[0];
        float y = event.values[1];
        float z = event.values[2];

        tv.setText("Rotation around X, Azimuth = " + x);
        tv1.setText("Rotation around Y, Pitch = " + y);
        tv2.setText("Rotation around Z, Roll = " + z);
    }
    if (mySensor.getType() == SensorManager.SENSOR_PROXIMITY)
    {

        float p = event.values[0];
        tv3.setText("Proximity = " + p);

    }

Затем в onSensorChanged - см. выше

на моем LG Optimus One, я могу получить его для отображения значений в TextViews датчика ориентации (этоу телефона нет датчика приближения)

Но запуск того же кода на моем Nexus One приводит к прекрасному пустому экрану!?

Извините за длинный вопрос!но любая помощь будет хорошей, и если вам нужна дополнительная информация, просто спросите, LG телефон 2.2 Nexus One 2.2.2 Спасибо,

David

1 Ответ

1 голос
/ 12 марта 2011

Вы можете использовать один и тот же слушатель для всех датчиков.Но если вы действительно хотите прослушать несколько или даже все датчики, вам нужно переписать эту строку:

mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ALL) , SensorManager.SENSOR_DELAY_GAME);

Поскольку фактическая реализация getDefaultSensor(int type) возвращает только один датчик, как видно из исходного кода:

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);
}

public List<Sensor> getSensorList(int type) {
    // cache the returned lists the first time
    List<Sensor> list;
    final ArrayList<Sensor> fullList = sFullSensorsList;
    synchronized(fullList) {
        list = sSensorListByType.get(type);
        if (list == null) {
           if (type == Sensor.TYPE_ALL) {
               list = fullList;
           } else {
                list = new ArrayList<Sensor>();
                for (Sensor i : fullList) {
                     if (i.getType() == type)
                        list.add(i);
                }
           }
           list = Collections.unmodifiableList(list);
           sSensorListByType.append(type, list);
       }

    return list;
}

Таким образом, в случае Sensor.TYPE_ALL метод getSensorList(int type) предоставляет ( неупорядоченный ) список всех доступных датчиков, а getDefaultSensor(int type) возвращает только первый из них.

Поскольку список, содержащий все датчики, неупорядочен, getDefaultSensor (Sensor.TYPE_ALL) предоставляет случайный датчик.Я попробовал это и сначала получил акселерометр и в следующий раз датчик света.Поскольку вы обрабатываете только изменения ориентации и близости в вашем слушателе, я подозреваю, что getDefaultSensor (Sensor.TYPE_ALL) предоставил другой датчик на Nexus.

Вы должны получить список всех датчиков, доступных с mSensorManager.getSensorList(Sensor.TYPE_ALL) иПовторите список, чтобы зарегистрировать каждый содержащийся датчик соответственно.

Относительно вашего вопроса об экономии заряда батареи - я не знаю, работают ли датчики постоянно.Даже если это так, всегда можно сэкономить заряд батареи, уменьшив ненужную обработку.Если вам не нужна информация, которую предоставляет конкретный датчик, не регистрируйтесь для получения сообщений от него.Это уменьшает количество сообщений, отправляемых на ваше приложение.

...