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

#android #delphi #location #firemonkey #android-sensors

#Android #delphi #Расположение #firemonkey #android-датчики

Вопрос:

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

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

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

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

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

Комментарии:

1. запустите LocationSensor1 из события таймера и отключите таймер после. И включите таймер в событии FormCreate

2. Это своеобразно. Я попробовал это сам. Я запустил приложение, в котором датчик местоположения установлен Active во время разработки, с отключенными настройками местоположения на устройстве. Затем, когда приложение было запущено, я включил настройки местоположения. Конечно же, как и ожидалось onLocationChanged , метод в JLocationListener реализации в системе. Android. Вызван Sensor.pas TCustomLocationSensor.DoLocationChanged , который, в свою очередь, вызвал OnLocationChanged обработчик событий моего датчика местоположения. Интересно, что отличается в вашем случае. Вы пробовали тривиальный автономный пример, как я сделал?

3. Я провожу несколько тестов. Иногда запуск датчика работает, но во многих случаях нет. Я не понимаю этого поведения. Вероятность начала работы датчика возрастает, если я разрешаю местоположение сразу после запуска приложения. Датчик местоположения по-прежнему установлен как активный!

4. Я обнаружил ту же проблему при запуске образца Delphi OrientationSensor на Android. Получено только одно значение датчика 0.00 / NaN. Чтобы иметь дело с разрешениями уровня API 26, вы не можете установить active := true во время разработки, поэтому нет способа запустить датчик

5. Что вы подразумеваете под невозможностью запуска датчика?

Ответ №1:

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

Редактировать: добавлено вручную в AndroidManifest.xml:

 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  

Комментарии:

1. Не могли бы вы объяснить это более подробно?

2. Я изменил ответ

Ответ №2:

В последних версиях 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}
  

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