По теме из базы знаний
- Автоматизация службы доставки - Удобное решение: Служба доставки + Фастфуд 3.0 (Поддержка онлайн-касс, 54-ФЗ, ЕГАИС)
- Определение местоположения (GPS координат) мобильного устройства в web-клиенте
- Распознавание лиц (off-line). Демонстрационная база.
- Определение геокоординат в мобильной платформе с помощью внешней компоненты
- Мобильная бригада — приложение ТОиР на мобильной платформе 1С для ускорения выполнения ремонтов
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) ka3a4ok, есть и другие способы посадить батарею за час, но раз вы выбрали именно этот, то самый очевидный способ - опрашивать чаще. Там довольно развесистые алгоритмы, которые решают, сколько всего сделать для очередного определения координат, а зависит это от времени и смещения с момента предыдущего определения.
(2) vasyak319, за час это конечно вы утрируете... ведь например навителл не садит за час и на весь рабочий день хватает ездить по навигатору. Да это и не важно - эксплуатация в основном в автомобиле, а там есть зарядка. Важно то, что определение местоположения подвешивает программу пока провайдер не вернет координаты - это не удобно с точки зрения юзабилити. А если последнее определение местоположения было например полчаса назад, а пользователь вместе с устройством переместился за это время на энное количество километров, то устройству иногда может понадобиться ни минута и ни две, чтоб снова найти спутники.
Вобщем хочу чтоб пользователь в тот момент когда программе понадобятся координаты, не втыкал на крутящийся кружочек!
Вобщем хочу чтоб пользователь в тот момент когда программе понадобятся координаты, не втыкал на крутящийся кружочек!
(4) dj_serega, может я просто не правильно пользуюсь...
У меня вот так:
Андроидовский значек GPS вверху экрана сначала отсутствует, потом когда вызываю ОбновитьМестоположение() появляется и начинает моргать, если местоположение определено он загорается и горит еще пару сек, потом опять тухнет (т.е. устройство отключает gps). я так понимаю, он должен гореть постоянно как при использовании навитела например
У меня вот так:
СредстваГеопозиционирования.ОбновитьМестоположение(ТекущийПровайдер, 60); // даже за 60 сек иногда не успевает найти спутники
Местоположение = СредстваГеопозиционирования.ПолучитьПоследнееМестоположение(ТекущийПровайдер);
Андроидовский значек GPS вверху экрана сначала отсутствует, потом когда вызываю ОбновитьМестоположение() появляется и начинает моргать, если местоположение определено он загорается и горит еще пару сек, потом опять тухнет (т.е. устройство отключает gps). я так понимаю, он должен гореть постоянно как при использовании навитела например
(5) ka3a4ok, У меня вот такой код есть работоспособным.
// Процедура в модуле управляемого приложения
Процедура ПриНачалеРаботыСистемы()
#Если МобильноеПриложениеКлиент Тогда
РаботаСГеоданнымиКлиент.ПодключитьОпросКоординат();
#КонецЕсли
КонецПроцедуры
// Процедуры в общем модуле РаботаСГеоданнымиКлиент
#Если МобильноеПриложениеКлиент Тогда
Процедура ПодключитьОпросКоординат(Провайдер = "network") Экспорт
Попытка
СекундыНаОбновление = РаботаСГеоданнымиСервер.ПолучитьПериодОпросаКоординат(); // По умолчанию 30 минут, задается в константах
МассивПровайдеров = СредстваГеопозиционирования.ПолучитьПровайдеров();
Инд = 0;
Для Каждого ТекущийПровайдер Из МассивПровайдеров Цикл
Если ТекущийПровайдер.Имя = "passive" Тогда
Продолжить;
КонецЕсли;
ЧастотаОбновления = СекундыНаОбновление + Инд;
ОписаниеОповещения = Новый ОписаниеОповещения("ОпросКоординат", РаботаСГеоданнымиКлиент);
СредстваГеопозиционирования.ПодключитьОбработчикИзмененияМестоположения(ОписаниеОповещения, ТекущийПровайдер.Имя, , ЧастотаОбновления);
Инд = Инд + 1;
КонецЦикла;
Исключение
РаботаСОшибками.ЗаписатьВЛогРаботы("Ошибка получения координат. Причина: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры // ПодключитьОпросКоординат
Процедура ОпросКоординат(ИмяПровайдера, ДанныеМестоположения, ДополнительныеДанные) Экспорт
РаботаСГеоданнымиСервер.ЗафиксироватьКоординаты(ИмяПровайдера, ДанныеМестоположения); // Тут запись в регистр сведений
КонецПроцедуры // ОпросКоординат
#КонецЕсли
Показать
(1) я бы еще посоветовал утилиты для этой задачи использовать. Да, внешний софт, однако - работает полностью в фоне, забирать данные можно тогда, когда нужно, не будет проблем, если в середине дороги - 1с выпало в крит и ее сразу не запустили, так как в этом случае - теряется часть маршрута. Тоже самое и если вы просто свернете 1С, то андроид ее может просто убить, если ему будет мало памяти.
Подниму тему.
Не получается снимать координаты в фоне на мобильном приложении.
При старте системы запускаю обработчик ожидания, который запускает уже фоновое задание.
Но! Фоновое задание работает только на сервере, а ОбновитьМестоположение и ПолучитьПоследнееМестоположение работают только на клиенте.
Вынес определение координат на клиент.
Код такой:
Пишет что задание выполняется, захожу в регистр, данных нет.
Подскажите как правильно снимать координаты в фоне?
Не получается снимать координаты в фоне на мобильном приложении.
При старте системы запускаю обработчик ожидания, который запускает уже фоновое задание.
Но! Фоновое задание работает только на сервере, а ОбновитьМестоположение и ПолучитьПоследнееМестоположение работают только на клиенте.
Вынес определение координат на клиент.
Код такой:
//модуль управляемого приложения
Процедура ПриНачалеРаботыСистемы()
ЗапуститьМониторинг();
КонецПроцедуры
Процедура ЗапуститьМониторинг() Экспорт
ИнтервалОпределенияКоординатВСекундах = ОбменДанными.ПолучитьЧастотуСнятияКоординат();
Если НЕ ЗначениеЗаполнено(ИнтервалОпределенияКоординатВСекундах) Тогда
ИнтервалОпределенияКоординатВСекундах = 10;
КонецЕсли;
ПодключитьОбработчикОжидания("ОпределитьТекущиеКоординаты",ИнтервалОпределенияКоординатВСекундах,Ложь);
КонецПроцедуры
Процедура ОпределитьТекущиеКоординаты() Экспорт
#Если МобильноеПриложениеКлиент Тогда
ОбменДанными.ВыполнитьФоновоеСнятиеКоординат();
#КонецЕсли
КонецПроцедуры
// общий модуль ОбменДанными (сервер, вызов сервера)
&НаСервере
Процедура ВыполнитьФоновоеСнятиеКоординат() Экспорт
Задание = ФоновыеЗадания.Выполнить("ОбменДанными.ОпределитьТекущиеКоординатыСервер");
Задание.ОжидатьЗавершения();
КонецПроцедуры
&НаСервере
Процедура ОпределитьТекущиеКоординатыСервер() Экспорт
ТекущийПровайдер = "gps";
Попытка
ДМ = ОбменДанными.сгПолучитьПоследнееМестоположение(ТекущийПровайдер);
Исключение
ДМ = Неопределено;
КонецПопытки;
Если ДМ = Неопределено Тогда
ОбменДанными.сгОбновитьМестоположение(ТекущийПровайдер);
ДМ = ОбменДанными.сгПолучитьПоследнееМестоположение(ТекущийПровайдер);
КонецЕсли;
Если ДМ = Неопределено Тогда
ТекущийПровайдер = "network";
Попытка
ДМ = ОбменДанными.сгПолучитьПоследнееМестоположение(ТекущийПровайдер);
Исключение
ДМ = Неопределено;
КонецПопытки;
КонецЕсли;
Если ДМ = Неопределено Тогда
Возврат;
КонецЕсли;
Если ТекущаяДата() - МестноеВремя(ДМ.Дата) > 5 Тогда
ОбменДанными.сгОбновитьМестоположение(ТекущийПровайдер);
ДМ = ОбменДанными.сгПолучитьПоследнееМестоположение(ТекущийПровайдер);
КонецЕсли;
Если ДМ = Неопределено Тогда
Возврат;
Иначе
ОбщийМодульСервер.ЗаписатьДанныеТрека(ДМ,ТекущийПровайдер);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция сгПолучитьПоследнееМестоположение(Провайдер) Экспорт
Возврат СредстваГеопозиционирования.ПолучитьПоследнееМестоположение(Провайдер)
КонецФункции
&НаКлиенте
Процедура сгОбновитьМестоположение(Провайдер) Экспорт
СредстваГеопозиционирования.ОбновитьМестоположение(Провайдер, 30);
КонецПроцедуры
ПоказатьПишет что задание выполняется, захожу в регистр, данных нет.
Подскажите как правильно снимать координаты в фоне?
Вопрос решен положительно.
Так вот, чтобы снимать координаты в мобильном приложении в фоне (независимо от работы пользователя) можно использовать метод ПодключитьОбработчикИзмененияМестоположения. Об этом писали выше в теме, но так как объяснения никакого толком небыло, то и этом вариант остался в тени )
В итоге, финальная конструция следующая: (делаю вставку как текст чтобы гугл смг найти код)
Процедура ПриНачалеРаботыСистемы()
ЗапуститьМониторинг();
КонецПроцедуры
Процедура ЗапуститьМониторинг() Экспорт
ИнтервалОпределенияКоординатВСекундах = 10;
ПодключитьОбработчикОжидания("ОпределитьТекущиеКоординаты",ИнтервалОпределенияКоординатВСекундах,Ложь);
КонецПроцедуры
Процедура ОпределитьТекущиеКоординаты() Экспорт
ГеопозиционированиеКлиент.ОпределитьТекущиеКоординатыНаКлиенте();
КонецПроцедуры
Процедура ОпределитьТекущиеКоординатыНаКлиенте() Экспорт
#Если МобильноеПриложениеКлиент Тогда
Провайдер = "network";
Попытка
СекундыНаОбновление = 10;
МассивПровайдеров = СредстваГеопозиционирования.ПолучитьПровайдеров();
Инд = 0;
Для Каждого ТекущийПровайдер Из МассивПровайдеров Цикл
Если ТекущийПровайдер.Имя = "passive" Тогда
Продолжить;
КонецЕсли;
ЧастотаОбновления = СекундыНаОбновление + Инд;
ОписаниеОповещения = Новый ОписаниеОповещения("ОпросКоординат", ГеопозиционированиеКлиент);
СредстваГеопозиционирования.ПодключитьОбработчикИзмененияМестоположения(ОписаниеОповещения, ТекущийПровайдер.Имя, , ЧастотаОбновления);
Инд = Инд + 1;
КонецЦикла;
Исключение
КонецПопытки;
#КонецЕсли
КонецПроцедуры
Процедура ОпросКоординат(ИмяПровайдера, ДанныеМестоположения, ДополнительныеДанные) Экспорт
ОбщийМодульСервер.ЗаписатьДанныеТрека(ДанныеМестоположения,ИмяПровайдера);
КонецПроцедуры // ОпросКоординат
Так вот, чтобы снимать координаты в мобильном приложении в фоне (независимо от работы пользователя) можно использовать метод ПодключитьОбработчикИзмененияМестоположения. Об этом писали выше в теме, но так как объяснения никакого толком небыло, то и этом вариант остался в тени )
В итоге, финальная конструция следующая: (делаю вставку как текст чтобы гугл смг найти код)
Процедура ПриНачалеРаботыСистемы()
ЗапуститьМониторинг();
КонецПроцедуры
Процедура ЗапуститьМониторинг() Экспорт
ИнтервалОпределенияКоординатВСекундах = 10;
ПодключитьОбработчикОжидания("ОпределитьТекущиеКоординаты",ИнтервалОпределенияКоординатВСекундах,Ложь);
КонецПроцедуры
Процедура ОпределитьТекущиеКоординаты() Экспорт
ГеопозиционированиеКлиент.ОпределитьТекущиеКоординатыНаКлиенте();
КонецПроцедуры
Процедура ОпределитьТекущиеКоординатыНаКлиенте() Экспорт
#Если МобильноеПриложениеКлиент Тогда
Провайдер = "network";
Попытка
СекундыНаОбновление = 10;
МассивПровайдеров = СредстваГеопозиционирования.ПолучитьПровайдеров();
Инд = 0;
Для Каждого ТекущийПровайдер Из МассивПровайдеров Цикл
Если ТекущийПровайдер.Имя = "passive" Тогда
Продолжить;
КонецЕсли;
ЧастотаОбновления = СекундыНаОбновление + Инд;
ОписаниеОповещения = Новый ОписаниеОповещения("ОпросКоординат", ГеопозиционированиеКлиент);
СредстваГеопозиционирования.ПодключитьОбработчикИзмененияМестоположения(ОписаниеОповещения, ТекущийПровайдер.Имя, , ЧастотаОбновления);
Инд = Инд + 1;
КонецЦикла;
Исключение
КонецПопытки;
#КонецЕсли
КонецПроцедуры
Процедура ОпросКоординат(ИмяПровайдера, ДанныеМестоположения, ДополнительныеДанные) Экспорт
ОбщийМодульСервер.ЗаписатьДанныеТрека(ДанныеМестоположения,ИмяПровайдера);
КонецПроцедуры // ОпросКоординат
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот