GPS нынче – одна из часто востребованных функций в мобильных устройствах и поэтому в этот раз будем рассматривать вопросы использования GPS в приложениях для Palm WebOS.
Итак… Работа с GPS в WebOS осуществляется посредством вызова системного сервиса palm://com.palm.location. Вызов сревиса происходит с помощью метода serviceRequest()
контроллера приложения. Тоесть в коде это выглядит как-то так:
this.controller.serviceRequest('palm://com.palm.location', ...);
В WebOS сервис, осуществляющий взаимодействие с GPS-приемником имеет три публичных метода:
getCurrentPosition
– Синхронный метод получения актуальных GPS-координатstartTracking
– Подписка на изменение GPS-координатgetReverseLocation
– Получение информации по указанным координатам (геокодер)
Рассмотрим каждый метод по очереди.
getCurrentPosition
В документации в качестве примера использования этого метода значится вот такой кусок кода:
this.controller.serviceRequest('palm://com.palm.location', { method:"getCurrentPosition", parameters:{}, onSuccess:{}, onFailure:{} } });
На самом же деле этот кусок кода описывает вызов метода только формально и вводит в заблуждение. Первое, с чем приходится столкнутьс, это доступ к полученным координатам. Если писать что-то внутри операторных скобок, которые указаны в качестве значения параметра onSuccess
, то получим ошибку. Правильным же способом является указание метода-обработчика для onSuccess
и onFailure
.
- onSuccess – метод, который будет вызван в случае если запрос отработал успешно
- onFailure – метод, который будет вызван в случае если запрос завершился с ошибкой
Тоесть минимально рабочим примером, который позволит нам получить координаты будет следующий код:
FirstAssistant.prototype.handleCoordButton = function(event) { this.controller.serviceRequest( 'palm://com.palm.location', { method:"getCurrentPosition", parameters: {}, onSuccess: this.getCooSuccessResponseHandler.bind(this), onFailure: {} }); } FirstAssistant.prototype.getCooSuccessResponseHandler = function(event){ this.controller.showAlertDialog({ title: $L("Location"), message: 'Latitude: '+event.latitude+'\nLongitude: '+event.longitude, choices: [ {label:$L("OK"), value:"ok"} ] }); }
Как видно в примере, мы указываем обработчик только для onSuccess
. Для onFailure
это делается аналогичным образом. В обработчике onFailure
модно также узнать код ошибки. Код ошибки содержится в свойстве errorCode
объекта, передаваемого в качестве параметра обработчика. errorCode
– это целочисленное свойство, которое может принимать одно из следующих значений:
- 0: Нет ошибки
- 1: Таймаут
- 2: Координаты недоступны
- 3: Неизвестная ошибка
- 5: Выключен сервис GPS
- 6: Доступ запрещен – Пользователь не принял условия лицензионного соглашения на использование сервиса GPS.
- 7: У приложения уже есть сообщение в очереди
- 8: Приложение временно в черном списке.
Если вы тестируете свое приложение на эмуляторе, то скорее всего сразу получите ошибку с кодом 6. Для того чтобы это исправить, надо в Launcher’е выбрать пункт Location Services и там согласиться с условиями лицензионного соглашения на использование геолокационных сервисов.
Кроме, собственно, широты и долготы, в обработчике получения координат можно узнать еще кучу полезной информации. Более детально о списке доступны параметров можно узнать здесь.
startTracking
Подписка на получение координат от сервиса. Очень полезная штука. Позволяет в асинхронном режиме получать новые значения координат. Пример из документации опять говорит нам вот что:
this.controller.serviceRequest('palm://com.palm.location', { method:"startTracking", parameters:{}, onSuccess:{}, onFailure:{} } });
И здесь, опять же, снова нехватает нормальной демонстрации того, как надо указывать обработчики для onSuccess
и onFailure
.
А на самом деле все должно быть как-то так:
first-scene.html
<div id="main" class="palm-hasheader"> <div class="palm-header">GPS Test</div> <div id="coordinates" class="palm-body-text">0</div> </div>
first-assistant.js
... FirstAssistant.prototype.setup = function() { this.controller.get("coordinates").update('Unknown'); this.points = 0; this.trackingHandle = this.controller.serviceRequest( 'palm://com.palm.location', { method:"startTracking", parameters: {"subscribe":true}, onSuccess: this.trackingSuccessResponseHandler.bind(this), onFailure: this.trackingFailedResponseHandler.bind(this) }); } FirstAssistant.prototype.cleanup = function(event) { this.trackingHandle.cancel(); } ... FirstAssistant.prototype.trackingSuccessResponseHandler = function(event){ this.points++; this.controller.get("coordinates").update( 'Coordinates:<ul>'+ '<li>Count: ' + this.points + '</li>'+ '<li>Latitude: ' + event.latitude + '</li>'+ '<li>Longitude: ' + event.longitude+'</li>'+ '</ul>'); } FirstAssistant.prototype.trackingFailedResponseHandler = function(event){ this.controller.get("coordinates").update( 'Failed to retrieve coordinates: ' + event.errorCode); } ...
Что мы тут сделали:
- Создали текстовое поле с идентификатором
coordinates
- В конструкторе подписались на событие получения GPS-координат
- Когда координаты приходят, показываем их в текстовом поле вместе со счетчиком получений
- Если происходит ошибка, то показываем сообщение об ошибке и код ошибки
- В деструкторе отписываемся от события вызвав метод
this.trackingHandle.cancel()
Обо всех остальных параметрах, получаемых в onSuccess
можно прочитать здесь.
getReverseLocation
Пример кода в документации следующий:
this.controller.serviceRequest('palm://com.palm.location', { method:"getReverseLocation", parameters:{}, onSuccess:{}, onFailure:{} } });
В качестве параметров метода могут фигурировать latitude
и longitude
– широта и долгота.
В onSuccess
в объекте-параметре метода свойство address
будет содержать адрес, полученный по указанным координатам.
В onFailure коды ошибки могут быть такими:
- 0: Нет ошибок
- 6: Доступ запрещен
- 7: У приложения есть сообщения в очереди
- 8: Приложение временно в черном списке
Более подробно о методе getReverseLocation
можно узнать здесь.