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

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 390 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 390 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 390 08.09.16 15:38 Сейчас в теме
(10) DeniNikitin, Посмотрите в СП по "ДанныеМестоположения" :)
8. DitriX 2091 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) полагаю, с целью того, чтобы процедуры опроса координат запускались не одновременно, а асинхронно
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)