После того, как я нашел этот хороший пользовательский компонент, который аналогично (это правильное слово?) отображает температуру, считанную с датчика температуры устройства 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();
.
Я нахожу этот пример пользовательского компонента пользовательского интерфейса очень интересным и надеюсь, что кто-то разъяснит и, возможно, отполирует код.
analogly
было правильным словом, я хотел сказать, что это похоже на аналоговый датчик. О полном коде - код довольно большой, и я не уверен, что будет нормально копировать/вставлять чужой код, поэтому я дал ссылку на источник. Кроме того, как я вижу, Vintage Thermometer хорошо известен здесь на stackoverflow, упоминается во многих статьях. - person Chupo_cro   schedule 11.04.2012