Как отслеживать местоположение пользователя в любое время с помощью приложения Delphi под Android / IOS

1

Мне нужно постоянно отслеживать местоположение пользователя, даже если пользователь не использует мое приложение. Однако мои знания о архитектуре android/ios немного ниже, чтобы знать, как это сделать.

Нужно ли мне делать все свое приложение в памяти в любое время (и я думаю, что это будет небольшая трата ресурсов), или мне нужно создать небольшое приложение вроде сервиса (даже не знаю, возможно ли это ) для выполнения этой работы?

Теги:
firemonkey

1 ответ

2
Лучший ответ

Попробуйте использовать службу Android с атрибутом START_STICKY. В фоновом потоке вы можете прослушивать изменения местоположения (не используйте стандартный LocationSensor - просто реализуйте решение на основе Java).

Вы также можете найти примеры фоновых операций для iOS.

Для андроид вас может заинтересовать единица Androidapi.JNI.Location

TLocationListener = class(TJavaLocal, JLocationListener)
  public
    procedure onLocationChanged(location: JLocation); cdecl;
    procedure onProviderDisabled(provider: JString); cdecl;
    procedure onProviderEnabled(provider: JString); cdecl;
    procedure onStatusChanged(provider: JString; status: Integer; extras: JBundle); cdecl;
end

И для вашего сервисного модуля вы должны объявить некоторые переменные

TServiceModule = class(TAndroidService)
  function AndroidServiceStartCommand(const Sender: TObject;
    const Intent: JIntent; Flags, StartId: Integer): Integer;
private
  FLocationManager: JLocationManager;
  FLocationManagerService: JObject;
  FLocationListener: JLocationListener;

function TServiceModule.AndroidServiceStartCommand(const Sender: TObject;
  const Intent: JIntent; Flags, StartId: Integer): Integer;
begin
  Result := TJService.JavaClass.START_STICKY;

  FLocationManagerService := TAndroidHelper.Context.getSystemService(
    TJContext.JavaClass.LOCATION_SERVICE);
  FLocationManager := TJLocationManager.Wrap(
    (FLocationManagerService as ILocalObject).GetObjectID);

  if FLocationManager.isProviderEnabled(
    TJLocationManager.JavaClass.GPS_PROVIDER) then
  begin
    FLocationListener := TLocationListener.Create;
      FLocationManager.requestLocationUpdates(TJLocationManager.JavaClass.GPS_PROVIDER,
        0, 0, FLocationListener, TJLooper.JavaClass.getMainLooper);
  • 0
    спасибо tomasz, что означают start_sticky?
  • 0
    от google android, руководство разработчика developer.android.com/reference/android/app/Service.html «START_STICKY используется для служб, которые явно запускаются и останавливаются при необходимости». «если процесс этой службы завершается во время ее запуска (после возврата из onStartCommand (Intent, int, int)), то оставьте его в запущенном состоянии, но не сохраняйте это доставленное намерение. Позже система попытается воссоздать обслуживание"
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню