Учимся работать с GPS в Palm WebOS

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 можно узнать .
Еще интересные посты о программировании для мобильных устройств:
1 Comment
Make A CommentComments RSS Feed TrackBack URL

March 26th, 2010 at 22:18
[...] описывал впечатления. Из этой затеи получилось это, это, это и еще несколько [...]