#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.pasTCustomLocationSensor.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}
Конечно, оба разрешения также должны быть проверены в параметрах проекта, но это уже по умолчанию.