Датчик местоположения Delphi Android не работает, если местоположение разрешено после запуска приложения

У меня интересная проблема с TLocationSensor. Если местоположение разрешено в меню Android до запуска приложения, датчик работает нормально. Я ловлю событие OnLocationChange. Но если я не разрешаю местоположение в меню Android и запускаю приложение, а затем разрешаю местоположение в меню Android, датчик не работает.

Событие OnLocationChange не вызывается.

Set LocationSensor1.Active := true; в этом случае не помогает.

Как я могу автоматически разрешить определение местоположения после запуска моего приложения?

Я использую Delphi XE10.1 Berlin и Android 6.0


person milenjao    schedule 01.10.2016    source источник
comment
запустите LocationSensor1 из события таймера и отключите таймер после. И включите Таймер в событии FormCreate   -  person ColdZer0    schedule 02.10.2016
comment
Это странно. Я сам это пробовал. Я запустил приложение, в котором датчик местоположения установлен Active во время разработки, а настройки местоположения отключены на устройстве. Затем, когда приложение было запущено, я включил настройки местоположения. Разумеется, как и ожидалось, метод onLocationChanged в реализации JLocationListener в System.Android.Sensor.pas вызвал TCustomLocationSensor.DoLocationChanged, который, в свою очередь, вызвал обработчик событий OnLocationChanged моего датчика местоположения. Интересно, а что в вашем случае по-другому? Вы пробовали тривиальный автономный пример, как это сделал я?   -  person blong    schedule 02.10.2016
comment
Провожу несколько тестов. Иногда запуск датчика срабатывает, но во многих случаях - нет. Я не понимаю такого поведения. Вероятность того, что датчик начнет работать, будет выше, если я разрешаю Location сразу после запуска приложения. Датчик местоположения по-прежнему активен!   -  person milenjao    schedule 03.10.2016
comment
Я обнаружил ту же проблему при запуске примера OrientationSensor Delphi на Android. Получено только одно показание датчика 0.00 / NaN. Чтобы иметь дело с разрешениями API уровня 26, вы не можете установить active: = true во время разработки, поэтому нет возможности запустить датчик.   -  person Omar Reis    schedule 06.11.2018
comment
Что ты имеешь в виду под запретом запуска сенсора?   -  person Dreamer64    schedule 05.10.2019


Ответы (2)


Сегодня боролся с той же проблемой. Ручная установка разрешений для приложений в моем случае сработала.

Изменить: вручную добавлено в AndroidManifest.xml:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
person Radacina    schedule 17.12.2020
comment
Не могли бы вы объяснить это поподробнее? - person maf-soft; 16.03.2021
comment
Я изменил ответ - person Radacina; 19.03.2021

В последних версиях Android необходимо запрашивать разрешения во время выполнения (при запуске или, может быть, лучше, если и когда вам это нужно).

{$IFDEF ANDROID}
uses
  System.Permissions,
  Androidapi.JNI.OS; 

PermissionsService.RequestPermissions([
  JStringToString(TJManifest_permission.JavaClass.ACCESS_COARSE_LOCATION),
  JStringToString(TJManifest_permission.JavaClass.ACCESS_FINE_LOCATION)],
  procedure(const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>)
  begin
    if (Length(AGrantResults) <> 2)
      or (AGrantResults[0] <> TPermissionStatus.Granted)
      or (AGrantResults[1] <> TPermissionStatus.Granted) then 
      Log('Location permissions not granted');
  end);
{$ENDIF}

Конечно, оба разрешения также должны быть проверены в параметрах проекта, но это уже значение по умолчанию.

person maf-soft    schedule 19.03.2021