Вопрос
Уточните, пожалуйста, для определение GPS-координат на мобильном устройстве Android используется Terrasoft.Geolocation.getCurrentCoordinates, который по каким-то причинам не запускает GPS-модуль (в UI устройства не появляется индикатор запуска GPS). Уточните пожалуйста, может ли информация о координатах сниматься без включения данного модуля (некий кэш координат)?
Ответ
Да, сервис GPS может не включаться. Данные могут браться на основании настроек мобильного устройства из WiFi-точек либо действительно могут кешироваться.
На самом деле, тем как bpm'online получает координаты, можно управлять. Приведу пример текущей реализации упомянутого метода:
getCurrentCoordinates: function(config) {
var enableHighAccuracy = !Terrasoft.Connection.isOnline() ||
Terrasoft.Connection.getType() !== Terrasoft.ConnectionTypes.WiFi;
var geo = Ext.create("Ext.util.Geolocation", {
autoUpdate: false,
allowHighAccuracy: enableHighAccuracy,
timeout: 60000,
listeners: {
scope: this,
locationupdate: function(geo) {
Ext.callback(config.success, config.scope, [geo.getLatitude(), geo.getLongitude()]);
},
locationerror: function(geo, timeout, permissionDenied, locationUnavailable, message) {
…
}
}
});
geo.updateLocation();
}
Сейчас, если нет интернет-соединения или это соединение – не WiFi (типа, EDGE, 3G), то будет использоваться «точное» позиционирование (с использованием GPS), иначе данные будут получены с использованием WiFi, кеширования и т.д., т.е. способами дающими неточные представления о местоположении устройства, но вполне достаточные для выполнения бизнес-задач.
Если, все-таки, нужно в любом случае получать данные с использованием GPS, можно создать свою реализацию действия, по аналогии с тем, как это реализовано в bpm'online:
getCurrentCoordinates: function(config) {
var geo = Ext.create("Ext.util.Geolocation", {
autoUpdate: false,
allowHighAccuracy: true,
timeout: 60000,
listeners: {
scope: this,
locationupdate: function(geo) {
Ext.callback(config.success, config.scope, [geo.getLatitude(), geo.getLongitude()]);
},
locationerror: function(geo, timeout, permissionDenied, locationUnavailable, message) {
…
}
}
});
geo.updateLocation();
}
При реализации нужно учитывать, что у такого способа есть ряд проблем:
- несмотря, что метод GPS более точен, время получения таких данных может быть достаточно больших (до 10-15 минут)
- соответсвенно время ожидания получения ответа нужно увеличить, т.е. параметр timeout выше в коде нужно будет устанавливать больше, чем 1 минуту (60000 мс)
- любые перекрытия, помехи в виде любых объектов могут не позволить получить координаты (например, у нас в офисе это нереально)
- быстрее садится батарея, что для Android-устройств весьма критично