Перейти к содержанию
  • Регистрация
  • 0
M1shQa

мониторинг gps, сети и батареи в фоне

Вопрос

Подкинуло начальство  задачку, да не простую. Приложение должно в фоне мониторить gps, собирать данные о батарее, логировать и потом сливать на сервер. Все это будет нащадно жрать батарею, понимаю, но начальству нужен именно этот вариант. Перейду к вопросам:

1.Нужно пилить сервис, но исходя из прошлых тем - таймер не работает, слипы не вариант, как сделать так, чтоб сервис просыпался каждые 5 минут/15 минут/ 1 час ?

2.Мониторинг GPS, тут решение вроде нашел в этой ветке для seattle, как лучше всего собирать и хранить данные для отправки? (до этого все сохранял в простых .txt)

3.Работают ли компоненты indy корректно в сервисе? срабатывают ли except'ы и как правильно мониторить подключение к сети? 

Проблема еще и в том, что программа должна работать более менее стабильно и если опыт написания простых приложений у меня есть, то с сервисами уже пару месяцев не могу подружиться..

Всем бобра!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рекомендуемые сообщения

  • 0

1) нужно пилить сервис, а вариант с AlarmManager не подойдёт? только не для приложения, а для сервиса

2) если особо не заморачиваться с БД (сразу отсылать на сервер или sqlLite), то можно в JSON

3) для сервисов да и вообще у ембы есть нативные реализации T(Net)HTTPClient

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
55 минут назад, Равиль Зарипов (ZuBy) сказал:

1) нужно пилить сервис, а вариант с AlarmManager не подойдёт? только не для приложения, а для сервиса

Нашел пару статей, так понимаю что-то вроде будильника, если можно через него настроить периодичность в 5 минут то это отличный вариант. Буду рыть в этом направлении, судя по статье alarm manager тоже не быстро пилится.. =(

С остальным все ок, благо с sqllite и json работал.  Нашел даже видео по AlarmManager, будем изучать, спасибо!)

Еще вопросик, т.к. опыта написания нормальных программ вообще не имею, лучше всего реализовать отдельными процедурами и вызывать их поочередно? (в теле сервиса)

Изменено пользователем MikeWuzHere

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 21.02.2017 в 13:24, Равиль Зарипов (ZuBy) сказал:

1) нужно пилить сервис, а вариант с AlarmManager не подойдёт? только не для приложения, а для сервиса

2) если особо не заморачиваться с БД (сразу отсылать на сервер или sqlLite), то можно в JSON

3) для сервисов да и вообще у ембы есть нативные реализации T(Net)HTTPClient

Еще пару вопросов: AlarmManager пилится для сервиса каким-то особенным способом? При передачи данных через http сервис не морозится как приложение?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


  • Похожий контент

    • От x11
      На основе нескольких тем форума сделал службу перехвата звонков и номера телефона.
      http://fire-monkey.ru/topic/3878-статьякак-создать-простой-android-broadcast-receiver-how-to-implement-simplest-android-broadcast-receiver-in-delphi/
      http://fire-monkey.ru/topic/2386-перехват-события-звонка/
      http://fire-monkey.ru/topic/2972-использование-нативных-localbroadcastmanager-и-broadcastreceiver/
      Покритикуйте пожалуйста. Уверен, что не всё правильно.
      Но что до ума не удалось довести, так это то, как правильно останавливать службу и закрывать приложение.
      Проект (для Токио) приложил теме.
      Заранее благодарен.
       
      BR2.rar
    • От Alex Bakulin
      Вопрос простой - есть какие-то встроенные методы, которые позволяют определять пройденное расстояние? Оно понятно, что можно искать расстояние между двумя точками, но вдруг уже до нас что-то придумали. 
    • От Rusland
      Проблема давняя, хочется наконец разобраться с ней.
      Вот создал тестовый пример, в котором приложение TestPro и локальный Android-сервис к нему TestService2.
      Запускаю программу, нажимаю кнопку Start Service, сервис стартует (увидеть можно в Настройки -> Приложения -> Работающие).
      Не закрывая программу, перехожу к другим программам и работаю в них. Лучше всего перейти в какой-нибудь браузер и полазить по вкладкам (это довольно ресурсоемкое приложение). 
      После нескольких минут через диспетчер задач я возвращаюсь в свое приложение и оно начинает загружаться с нуля. То есть система давно прибила программу и она начинает загрузку заново. Так вот программа долго висит на заставке, а потом выходит сообщение что приложение не отвечает! Нажимаем OK. После повторного перезапуска программы происходит тоже самое и лишь на третий раз программа запускается.
      Как решить эту проблему?
       
      Я пробовал убивать сервис
      var LIntent: JIntent; LIntent := TJIntent.Create; LIntent.setClassName(TAndroidHelper.Context.getPackageName(), TAndroidHelper.StringToJString('com.embarcadero.services.TestService2')); TAndroidHelper.Activity.stopService(LIntent); до строчки Application.Initialize - не помогает.
       
      TestService2.zip
    • От Rusland
      Есть два планшета Lenovo Tab 2 A7-30DC (назовем их A и Б). Есть написанная на Berlin программа с MapView.
      По умолчанию у обоих стояла ОС Android 4.4.2. На A я обновил операционку до максимальной официальной версии 5.0.1, на Б оставил 4.4.2
      На Б программа худо-бедно работает, но на MapView не показывает синюю точку - текущее местоположение (сторонние программы GPS Status, Яндекс Навигатор GPS координаты ловят нормально). Пробовал компилировать на Seattle - тоже самое. LocationSensor сначала неправильно показал координаты, ошибся на 300км, но после перезапуска программы стал показывать правильно. Почему MapView не показывает, не понимаю.
      На А программа зависает при попытке поставить метку на MapView или нарисовать маршрут получаю Segmentation fault.
      Вот, например:
      procedure TFrmMain.SetMarkerOnMap(Id:integer;NaimObj,AdrObj:String;Lat,Lon:Double); var Descrip: TMapMarkerDescriptor; MyLocation: TMapCoordinate; begin TThread.Queue(TThread.CurrentThread, procedure begin try if (MapView.Visible) then begin MyLocation:=TMapCoordinate.Create(Lat,Lon); Descrip:=TMapMarkerDescriptor.Create(MyLocation); Descrip.Icon:=ImObjBlueMarker.Bitmap; Descrip.Draggable:=False; Descrip.Title:=NaimObj; Descrip.Snippet:='['+Id.ToString+'] '; if (AdrObj<>'') then Descrip.Snippet:=Descrip.Snippet+AdrObj; MyMarker:=MapView.AddMarker(Descrip); // тут Segmentation fault LMarkers.Add(MyMarker); end; except end; end); end; Как решить проблему?
       
       
    • От Pax Beach
      Я реализовал пример работы с микрофоном и таймером в Android сервисе, как указано в теме вопроса.
      Каждый раз, когда вы отправляете в сервис StartCommand или сервис перезапускается, включается запись с микрофона, и сохраняется в каталог с музыков в файл "myrecord.3gp".
      Надеюсь, мой пример поможет вам создать новые полезные решения. В этом случае пожалуйста делитесь ими с участниками нашего сообщества.
      Для отладки своих программ на Android используйте запись в LOGI и чтение при помощи monitor.bat (PlatformSDKs\android-sdk-windows\tools).
       
      uses ... AndroidApi.JNI.Media, // JMediaRecorder AndroidApi.Timer, // Timer ...; Const TimerInterval = 1000; TimerCounterSecLimit = 10; type TDM = class(TAndroidService) ... private FTimerHandle: Integer; FRecording: Boolean; procedure StartRecord; procedure StopRecord; procedure StartTimer; procedure StopTimer; public FAudioRec: JMediaRecorder; end; procedure Log(const Fmt: string; const Params: array of const); overload; var Msg: string; M: TMarshaller; begin Msg := Format(Fmt, Params); LOGI(M.AsUtf8(Msg).ToPointer); end; procedure Log(const Source: string); overload; var M: TMarshaller; begin LOGI(M.AsUtf8(Source).ToPointer); end; procedure TDM.AndroidServiceCreate(Sender: TObject); begin FTimerHandle := 0; FTimerCounter := 0; FRecording := false; end; procedure TDM.AndroidServiceDestroy(Sender: TObject); begin StopTimer; StopRecord; end; function TDM.AndroidServiceStartCommand(const Sender: TObject; const Intent: JIntent; Flags, StartId: Integer): Integer; begin if Intent.getAction.equalsIgnoreCase(StringToJString('StopIntent')) then begin StopTimer; StopRecord; Result := TJService.JavaClass.START_NOT_STICKY; // don't reload service Log('- service stoped', []); end else begin if not FRecording then begin Log('... sound record to be started', []); StartRecord; StartTimer; end; Result := TJService.JavaClass.START_STICKY; // rerun service if it stops Log('+ Service started', []); end; end; procedure TDM.StartRecord; begin StopRecord; FAudioRec := TJMediaRecorder.Create; FAudioRec.setAudioSource(TJMediaRecorder_AudioSource.JavaClass.MIC); FAudioRec.setOutputFormat(TJMediaRecorder_OutputFormat.JavaClass.THREE_GPP); FAudioRec.setAudioEncoder(TJMediaRecorder_AudioEncoder.JavaClass.AMR_NB); FAudioRec.setOutputFile(StringToJString(TPath.Combine(TPath.GetSharedMusicPath, 'myrecord.3gp'))); try FAudioRec.Prepare(); FAudioRec.start; FRecording := True; Log('+ Start record to %s', [TPath.Combine(TPath.GetSharedMusicPath, 'myrecord.3gp')]); except on E: Exception do Log('- Error in mic recording: %s', [E.Message]); end; end; procedure TDM.StopRecord; begin if Assigned(FAudioRec) then begin if FRecording then begin FRecording := false; try FAudioRec.stop(); FAudioRec.release(); Log('- Mic recording is stoped'); except on E: Exception do Log('- Error in mic stop recording: %s', [E.Message]); end; end; end else begin FRecording := false; end; end; procedure TDM.WaitComplete(TimerId: Integer); begin if FTimerCounter < TimerCounterSecLimit then begin Log('+++ Timer is triggered %d time.', [FTimerCounter]); inc(FTimerCounter); end else StopTimer; end; procedure TDM.StartTimer; begin FTimerCounter := 0; if FTimerHandle = 0 then begin FTimerHandle := AndroidTimerCreate; AndroidTimerSetInterval(FTimerHandle, TimerInterval); end; AndroidTimerSetHandler(WaitComplete); Log('+ Timer started', []); end; procedure TDM.StopTimer; begin if FTimerHandle > 0 then begin Log('... MIC recording to be stopped'); StopRecord; AndroidTimerSetHandler(nil); Log('- Timer stoped', []); end; end; end.  
    • От Rusland
      Пытаюсь из сервиса вывести лог, но в monitor ничего не приходит.
      Для примера вот тестовый проект
      Проверьте, как у вас?
      PS. Из приложения лог приходит нормально
    • От Rusland
      В сервисе сохраняю дату и время вот так:
      var IniFile: TIniFile; SDT: string; FS: TFormatSettings; begin IniFile := TIniFIle.Create(System.IOUtils.TPath.Combine( System.IOUtils.TPath.GetDocumentsPath, 'D.ini')); try FormatSettings.ShortDateFormat:='yyyy-mm-dd'; FormatSettings.DateSeparator := '-'; FormatSettings.LongTimeFormat := 'hh:nn:ss'; FormatSettings.TimeSeparator := ':'; SDT:=DateTimeToStr(Now()); IniFile.WriteString('SERVER','LastOnline',SDT); finally IniFile.free; end; Получаю 31.05.2016 11:08
      Тот же самый код в основном приложении выдает 2016-05-31 11:08
      В чем моя ошибка?
      PS. Что происходит в сервисе дебагером посмотреть не удается, Дельфи просто не реагирует на точки останова
    • От Pax Beach
      Здравствуйте, коллеги!
      Я не хочу, чтобы в моем приложении пользователь мог подставлять фиктивные координаты своего местоположения, используя для этого функцию разработчика "mock location".
      Помогите пожалуйста правильным кодом или советом, как определять, включена ли данная функция на устройстве, чтобы соответственно ее обрабатывать?
       
    • От Pax Beach
      Коллеги, подскажите пожалуйста, как в Delphi из своего приложения перейти к настройкам устройства Android, в частности Wi-Fi и GPS?
      По нажатию кнопки пытаюсь выполнить такой код (нашел по теме на просторах), ничего не происходит ни в отладчике ни на экране. А, по идее, должна открыться Activity «Способ определения координат».
      var Intent: JIntent; WiFIServiceNative: JWifiManager; begin Intent := TJIntent.Create; Intent.setClassName(StringToJString('com.android.settings'), StringToJString('com.android.settings.widget.SettingsAppWidgetProvider')); Intent.addCategory(TJIntent.JavaClass.CATEGORY_ALTERNATIVE); Intent.setData(StrToJURI('3')); TAndroidHelper.Activity.sendBroadcast(Intent); ... Вот еще, здесь же пытаюсь программно выключить Wi-Fi — приложение вылетает с ошибкой «...class segmentation fault (11).», в отладчике методы Wi-Fi менеджера выполняются бесконечное количество раз, пока не вылетает указанная ошибка, т.е. нажатие F8 возвращает обратно на ту же строчку выполнения метода.
      WiFIServiceNative := JWifiManager(TAndroidHelper.Activity.getSystemService(TJContext.JavaClass.WIFI_SERVICE)); if Assigned(WiFIServiceNative) then begin memo1.Lines.Add('Has Wifi manager'); memo1.Lines.Add('Wifi state: ' + IntToStr(WiFIServiceNative.getWifiState)); memo1.Lines.Add('Try to Wi-Fi off:'); if WiFIServiceNative.setWifiEnabled(false) then memo1.Lines.Add(' - OK') else memo1.Lines.Add(' - FAIL');  
      Прошу вашей помощи — как правильно работать с настройками Android?
       
      Приложение пустое — кнопка и мемо.
      Permissions для проекта такие:
      <!-- This is the platform API where NativeActivity was introduced. --> <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="14" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_CALENDAR" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.WRITE_CALENDAR" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" />  
    • От M1shQa
      Есть проект, который ловит координаты широты и долготы через локейшн сервис, может поймать даже при выключенном GPS и это большая проблема. Как поставить приоритетность? дело в том, что если телефон получает данные о местоположении с помощью сотовой сети, то в программе проходит проверка включенности GPS и она стартует с "плохими" координатами.. Если в настройках телефона отключить использование для местоположения сотовой сети и включить использование ТОЛЬКО GPS то все работает, но клиент не будет разбираться в этом
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...