Пробуем датчики для мобильных устройств. Дельфи.

добавлено: 01 апр 13
понравилось:0
просмотров: 2002
комментов: 0

теги:

Автор: PeaK

Рассмотрим работу TSensorManager и что нам может предоставить айфон, и, в скором будущем, устройство с андроидом.

Для начала добавим System.Sensors в наш список юнитов.
Нам будет нужно пробежаться по списку категорий сенсоров, для этого удобно использовать цикл For особым образом:

var
  AllCat : TSensorCategories;
begin
  for LSensorCategory := Low(TSensorCategory) to High(TSensorCategory) do
  begin
    Memo1.Lines.Add(GetEnumName(TypeInfo(TSensorCategory),Ord(LSensorCategory)));
  end;
end;

Для визуализации на устройстве, я кинул на форму TMemo. В примере использовался метод GetEnumName, для его использования необходимо подключить System.TypInfo.

Картинка с другого сайта.

Получили довольно приличный список. Но что из перечисленного есть на устройстве?

Для начала нужна иннициализация TSensorManager
TSensorManager.Current.Activate();

после чего мы можем спокойно смотреть, что за классы у нас используются:

Мы можем получить что-то используя подобный код в цикле
  LSensorArray := TSensorManager.Current.GetSensorsByCategory(LSensorCategory);
  for LSensor in LSensorArray do
    Memo1.Lines.Add(' - ' + LSensor.ClassName);
И вывести имена классов.
Картинка с другого сайта.
Оп-па. Что-то много всего, начинающегося с TiOS.
Это имена классов которые реализуют функционал. Для андроида они будут другими, но базовый класс TCustomSensor для нас откроет все двери. Надеюсь :)
(Кто использует не настоящий девайс, а iOS-симулятор, тот увидит только один класс)

Итак, попробуем что-нибудь получить. Поскольку датчик позиции есть всюду, попробуем его.
  if LSensor is TCustomLocationSensor then

Казалось бы дальше можно объявить переменную и в цикле пройти по доступным свойствам (заодно и узнать их):
var
  LProperty : TCustomLocationSensor.TProperty;
...
  for LProperty in TCustomLocationSensor(LSensor).AvailableProperties do

Но нужный нам метод GetDoubleProperty находится в секции протектед, его можно перекрыть в наследнике, но в нашем случае не прокатит.
Поэтому просто берем и проверяем всё подряд:
for LSensor in LSensorArray do
begin
  Memo1.Lines.Add(' - ' + LSensor.ClassName);
  if LSensor is TCustomLocationSensor then
    Memo1.Lines.Add(Format('TrueHeading %3.5f ', [TCustomLocationSensor(LSensor).TrueHeading]));
end;

И если наш датчик поддерживает является наследником от этого класса, выводим значение и получаем Nan.
Картинка с другого сайта.
Добавим цикл и через некоторое время получим азимут. Не забудьте разрешить использовать датчики при старте приложения и включить WiFi, иначе ждать придется долго.

Но это всё актуально, если Вам не хочется использовать стандартную компоненту TLocationSensor.

Комментарии




Необходимо войти на сайт, чтобы оставлять комментарии