Определение местоположения

1. ka3a4ok 25.03.15 09:22 Сейчас в теме
Как заставить службу GPS работать в фоне постоянно?
Т.е. смысл чтоб при повторном вызове СредстваГеопозиционирования.ОбновитьМестоположение() устройство не задумывалось на 2 минуты как при первом вызове...

Версия платформы для разработки 8.3.4.437, версия мобильной платформы 8.3.4.22
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. vasyak319 150 25.03.15 10:24 Сейчас в теме
(1) ka3a4ok, есть и другие способы посадить батарею за час, но раз вы выбрали именно этот, то самый очевидный способ - опрашивать чаще. Там довольно развесистые алгоритмы, которые решают, сколько всего сделать для очередного определения координат, а зависит это от времени и смещения с момента предыдущего определения.
3. ka3a4ok 25.03.15 10:44 Сейчас в теме
(2) vasyak319, за час это конечно вы утрируете... ведь например навителл не садит за час и на весь рабочий день хватает ездить по навигатору. Да это и не важно - эксплуатация в основном в автомобиле, а там есть зарядка. Важно то, что определение местоположения подвешивает программу пока провайдер не вернет координаты - это не удобно с точки зрения юзабилити. А если последнее определение местоположения было например полчаса назад, а пользователь вместе с устройством переместился за это время на энное количество километров, то устройству иногда может понадобиться ни минута и ни две, чтоб снова найти спутники.

Вобщем хочу чтоб пользователь в тот момент когда программе понадобятся координаты, не втыкал на крутящийся кружочек!
4. dj_serega 391 25.03.15 11:09 Сейчас в теме
(3) ka3a4ok, Так определение местоположения происходит в фоновом режиме. Не нужно ждать "развиса" приложения. Я советую обновить релиз приложения. Последний (92й вроде) стабильный.
5. ka3a4ok 25.03.15 11:56 Сейчас в теме
(4) dj_serega, может я просто не правильно пользуюсь...
У меня вот так:
 СредстваГеопозиционирования.ОбновитьМестоположение(ТекущийПровайдер, 60); // даже за 60 сек иногда не успевает найти спутники
 Местоположение = СредстваГеопозиционирования.ПолучитьПоследнееМестоположение(ТекущийПровайдер);

Андроидовский значек GPS вверху экрана сначала отсутствует, потом когда вызываю ОбновитьМестоположение() появляется и начинает моргать, если местоположение определено он загорается и горит еще пару сек, потом опять тухнет (т.е. устройство отключает gps). я так понимаю, он должен гореть постоянно как при использовании навитела например
6. dj_serega 391 25.03.15 14:07 Сейчас в теме
(5) ka3a4ok, У меня вот такой код есть работоспособным.
// Процедура в модуле управляемого приложения
Процедура ПриНачалеРаботыСистемы()
	#Если МобильноеПриложениеКлиент Тогда
		РаботаСГеоданнымиКлиент.ПодключитьОпросКоординат();
	#КонецЕсли
КонецПроцедуры

// Процедуры в общем модуле РаботаСГеоданнымиКлиент
#Если МобильноеПриложениеКлиент Тогда
Процедура ПодключитьОпросКоординат(Провайдер = "network") Экспорт 
	Попытка
		СекундыНаОбновление = РаботаСГеоданнымиСервер.ПолучитьПериодОпросаКоординат(); // По умолчанию 30 минут, задается в константах
		МассивПровайдеров = СредстваГеопозиционирования.ПолучитьПровайдеров();
		Инд = 0;
		Для Каждого ТекущийПровайдер Из МассивПровайдеров Цикл
			Если ТекущийПровайдер.Имя = "passive" Тогда
				Продолжить;
			КонецЕсли;
			ЧастотаОбновления = СекундыНаОбновление + Инд;
			ОписаниеОповещения = Новый ОписаниеОповещения("ОпросКоординат", РаботаСГеоданнымиКлиент);
			СредстваГеопозиционирования.ПодключитьОбработчикИзмененияМестоположения(ОписаниеОповещения, ТекущийПровайдер.Имя, , ЧастотаОбновления);
			Инд = Инд + 1;
		КонецЦикла;
		
	Исключение
		РаботаСОшибками.ЗаписатьВЛогРаботы("Ошибка получения координат. Причина: " + ОписаниеОшибки());
	КонецПопытки;
КонецПроцедуры // ПодключитьОпросКоординат
Процедура ОпросКоординат(ИмяПровайдера, ДанныеМестоположения, ДополнительныеДанные) Экспорт 
	РаботаСГеоданнымиСервер.ЗафиксироватьКоординаты(ИмяПровайдера, ДанныеМестоположения); // Тут запись в регистр сведений
КонецПроцедуры // ОпросКоординат
#КонецЕсли
Показать
Liris; matashin; TuneSoft; ka3a4ok; +4 Ответить
7. ka3a4ok 25.03.15 15:48 Сейчас в теме
(6) dj_serega, благодарю! буду пробовать
10. DeniNikitin 36 08.09.16 14:09 Сейчас в теме
(6) dj_serega,
А что у вас в ДанныеМестоположения возвращается?
11. dj_serega 391 08.09.16 15:38 Сейчас в теме
(10) DeniNikitin, Посмотрите в СП по "ДанныеМестоположения" :)
8. DitriX 2093 26.03.15 11:00 Сейчас в теме
(1) я бы еще посоветовал утилиты для этой задачи использовать. Да, внешний софт, однако - работает полностью в фоне, забирать данные можно тогда, когда нужно, не будет проблем, если в середине дороги - 1с выпало в крит и ее сразу не запустили, так как в этом случае - теряется часть маршрута. Тоже самое и если вы просто свернете 1С, то андроид ее может просто убить, если ему будет мало памяти.
9. Al-77 73 31.05.16 21:20 Сейчас в теме
(8) DitriX, Какие например? если не секрет
15. пользователь 09.04.20 12:10
Сообщение было скрыто модератором.
...
12. user827704 27.08.18 17:37 Сейчас в теме
Подниму тему.

Не получается снимать координаты в фоне на мобильном приложении.
При старте системы запускаю обработчик ожидания, который запускает уже фоновое задание.
Но! Фоновое задание работает только на сервере, а ОбновитьМестоположение и ПолучитьПоследнееМестоположение работают только на клиенте.
Вынес определение координат на клиент.
Код такой:

//модуль управляемого приложения
Процедура ПриНачалеРаботыСистемы()
	ЗапуститьМониторинг();	
КонецПроцедуры

Процедура ЗапуститьМониторинг() Экспорт 
	ИнтервалОпределенияКоординатВСекундах = ОбменДанными.ПолучитьЧастотуСнятияКоординат();
	Если НЕ ЗначениеЗаполнено(ИнтервалОпределенияКоординатВСекундах) Тогда
		ИнтервалОпределенияКоординатВСекундах = 10;
	КонецЕсли;
	
	ПодключитьОбработчикОжидания("ОпределитьТекущиеКоординаты",ИнтервалОпределенияКоординатВСекундах,Ложь);
КонецПроцедуры

Процедура ОпределитьТекущиеКоординаты() Экспорт	
	#Если МобильноеПриложениеКлиент Тогда
		ОбменДанными.ВыполнитьФоновоеСнятиеКоординат();				
	#КонецЕсли		
КонецПроцедуры

// общий модуль ОбменДанными (сервер, вызов сервера)
&НаСервере
Процедура ВыполнитьФоновоеСнятиеКоординат() Экспорт 
	Задание = ФоновыеЗадания.Выполнить("ОбменДанными.ОпределитьТекущиеКоординатыСервер");
	Задание.ОжидатьЗавершения();
КонецПроцедуры

&НаСервере
Процедура ОпределитьТекущиеКоординатыСервер() Экспорт 
	ТекущийПровайдер = "gps";		
	Попытка			
		ДМ = ОбменДанными.сгПолучитьПоследнееМестоположение(ТекущийПровайдер);
	Исключение			
		ДМ = Неопределено;
	КонецПопытки;
	
	Если ДМ = Неопределено Тогда
		ОбменДанными.сгОбновитьМестоположение(ТекущийПровайдер);
		ДМ = ОбменДанными.сгПолучитьПоследнееМестоположение(ТекущийПровайдер);
	КонецЕсли;
	
	Если ДМ = Неопределено Тогда
		ТекущийПровайдер = "network";			
		Попытка	
			ДМ = ОбменДанными.сгПолучитьПоследнееМестоположение(ТекущийПровайдер);
		Исключение				
			ДМ = Неопределено;				
		КонецПопытки;			
	КонецЕсли;
	
	Если ДМ = Неопределено Тогда			
		Возврат;			
	КонецЕсли;
	
	Если ТекущаяДата() - МестноеВремя(ДМ.Дата) > 5 Тогда			
		ОбменДанными.сгОбновитьМестоположение(ТекущийПровайдер);
		ДМ = ОбменДанными.сгПолучитьПоследнееМестоположение(ТекущийПровайдер);			
	КонецЕсли;
	
	Если ДМ = Неопределено Тогда			
		Возврат;			
	Иначе
		ОбщийМодульСервер.ЗаписатьДанныеТрека(ДМ,ТекущийПровайдер);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Функция сгПолучитьПоследнееМестоположение(Провайдер) Экспорт 
	Возврат СредстваГеопозиционирования.ПолучитьПоследнееМестоположение(Провайдер)	
КонецФункции

&НаКлиенте
Процедура сгОбновитьМестоположение(Провайдер) Экспорт 
	СредстваГеопозиционирования.ОбновитьМестоположение(Провайдер, 30);		
КонецПроцедуры

Показать


Пишет что задание выполняется, захожу в регистр, данных нет.
Подскажите как правильно снимать координаты в фоне?
13. user827704 31.08.18 10:05 Сейчас в теме
Вопрос решен положительно.

Так вот, чтобы снимать координаты в мобильном приложении в фоне (независимо от работы пользователя) можно использовать метод ПодключитьОбработчикИзмененияМестоположения. Об этом писали выше в теме, но так как объяснения никакого толком небыло, то и этом вариант остался в тени )
В итоге, финальная конструция следующая: (делаю вставку как текст чтобы гугл смг найти код)

Процедура ПриНачалеРаботыСистемы()
ЗапуститьМониторинг();
КонецПроцедуры

Процедура ЗапуститьМониторинг() Экспорт
ИнтервалОпределенияКоординатВСекундах = 10;
ПодключитьОбработчикОжидания("ОпределитьТекущиеКоординаты",ИнтервалОпределенияКоординатВСекундах,Ложь);
КонецПроцедуры

Процедура ОпределитьТекущиеКоординаты() Экспорт
ГеопозиционированиеКлиент.ОпределитьТекущиеКоординатыНаКлиенте();
КонецПроцедуры


Процедура ОпределитьТекущиеКоординатыНаКлиенте() Экспорт
#Если МобильноеПриложениеКлиент Тогда
Провайдер = "network";
Попытка
СекундыНаОбновление = 10;
МассивПровайдеров = СредстваГеопозиционирования.ПолучитьПровайдеров();
Инд = 0;
Для Каждого ТекущийПровайдер Из МассивПровайдеров Цикл
Если ТекущийПровайдер.Имя = "passive" Тогда
Продолжить;
КонецЕсли;
ЧастотаОбновления = СекундыНаОбновление + Инд;
ОписаниеОповещения = Новый ОписаниеОповещения("ОпросКоординат", ГеопозиционированиеКлиент);
СредстваГеопозиционирования.ПодключитьОбработчикИзмененияМестоположения(ОписаниеОповещения, ТекущийПровайдер.Имя, , ЧастотаОбновления);
Инд = Инд + 1;
КонецЦикла;
Исключение

КонецПопытки;
#КонецЕсли
КонецПроцедуры

Процедура ОпросКоординат(ИмяПровайдера, ДанныеМестоположения, ДополнительныеДанные) Экспорт
ОбщийМодульСервер.ЗаписатьДанныеТрека(ДанныеМестоположения,ИмяПровайдера);
КонецПроцедуры // ОпросКоординат
Liris; PlatonStepan; +2 Ответить
14. Liris 39 05.03.20 14:26 Сейчас в теме
(13) Добрый день!
Вы инкрементируете переменную ЧастотаОбновления:
ЧастотаОбновления = СекундыНаОбновление + Инд;


Поясните, для чего это делается?
16. pLinka 28.05.21 09:27 Сейчас в теме
(14) полагаю, с целью того, чтобы процедуры опроса координат запускались не одновременно, а асинхронно
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот