Компонент Vintage Thermometer + SensorSimulator на эмуляторе Android

После того, как я нашел этот хороший пользовательский компонент, который аналогично (это правильное слово?) отображает температуру, считанную с датчика температуры устройства Android, я хотел протестировать его с помощью эмулятора, чтобы увидеть, как он работает, поэтому я нашел симулятор датчика и изменил исходный код компонента для работы с ним.

Мне удалось заставить его работать на эмулированном устройстве, однако я сделал несколько удачных предположений и хотел бы знать, что именно я сделал :-)

Вот изменения в коде термометра, которые мне пришлось внести, чтобы заставить его работать в сочетании с симулятором датчика температуры:

После импорта классов sensorsimulator:

import org.openintents.sensorsimulator.hardware.Sensor;
import org.openintents.sensorsimulator.hardware.SensorEvent;
import org.openintents.sensorsimulator.hardware.SensorEventListener;
import org.openintents.sensorsimulator.hardware.SensorManagerSimulator;

я должен был удалить

import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;

Измененный

private SensorManager getSensorManager()

в

private SensorManagerSimulator getSensorManager()

Тогда возникла первая проблема. В соответствии с Как использовать SensorSimulator в вашем приложении я изменил строку:

return (SensorManager) getContext().getSystemService(Context.SENSOR_SERVICE);

в

return SensorManagerSimulator.getSystemService(this, SENSOR_SERVICE);

и это была ошибка. Вместо this мне пришлось использовать getContext(), я не уверен, почему это так - может быть, потому что класс thermometer расширяет View, поэтому это не активность? И вместо SENSOR_SERVICE пришлось поставить Context.SENSOR_SERVICE.

После этого было следующее изменение:

private void attachToSensor() {
    SensorManagerSimulator sensorManager = getSensorManager();
    sensorManager.connectSimulator();

Поскольку кажется, что sensorsimulator не реализует getSensorList, мне пришлось заменить

List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_TEMPERATURE);

с

Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_TEMPERATURE);

и удалить

if (sensors.size() > 0) {
        Sensor sensor = sensors.get(0);

Затем, конечно, я также удалил оператор else, поэтому ситуация, когда датчик температуры отсутствует, теперь, вероятно, вызовет исключение при попытке зарегистрировать слушателя.

В конце было еще одно изменение, которое мне пришлось сделать, чтобы избавиться от ошибок компиляции, по какой-то причине реализация registerListener в Sensor Simulator принимает меньше аргументов, чем метод андроида, поэтому мне пришлось удалить параметр handler из

sensorManager.registerListener(this, sensor, SensorManagerSimulator.SENSOR_DELAY_FASTEST, handler);

Вот, я хотел бы знать, почему на этот раз мне не пришлось использовать getContext() вместо this!?

Это все, что мне пришлось изменить, последнее, что нужно было сделать, это удалить неиспользуемые переменные (обработчик), неиспользуемый импорт (java.util.List) и удалить handler = new Handler();.

Я нахожу этот пример пользовательского компонента пользовательского интерфейса очень интересным и надеюсь, что кто-то разъяснит и, возможно, отполирует код.


person Chupo_cro    schedule 11.04.2012    source источник
comment
я просто должен был сказать, что он на самом деле цифровой, потому что пользовательский интерфейс обновляется с определенной частотой, аналоговый означает непрерывный или в реальном времени.   -  person L7ColWinters    schedule 11.04.2012
comment
также поместите полный код вместо того, какие изменения вы внесли, если их больше нескольких, и что касается getContext() по сравнению с этим, любой объект, который вы вызвали registerListener внутри, является дочерним элементом ContextWrapper   -  person L7ColWinters    schedule 11.04.2012
comment
@L7ColWinters: я не уверен, что analogly было правильным словом, я хотел сказать, что это похоже на аналоговый датчик. О полном коде - код довольно большой, и я не уверен, что будет нормально копировать/вставлять чужой код, поэтому я дал ссылку на источник. Кроме того, как я вижу, Vintage Thermometer хорошо известен здесь на stackoverflow, упоминается во многих статьях.   -  person Chupo_cro    schedule 11.04.2012