如果应用程序启动后允许位置,Delphi Android 位置传感器不起作用

Posted

技术标签:

【中文标题】如果应用程序启动后允许位置,Delphi Android 位置传感器不起作用【英文标题】:Delphi Android Location Sensor not working if location allowed after application start 【发布时间】:2017-02-10 00:28:39 【问题描述】:

我对@9​​87654321@ 有一个有趣的问题。如果在我启动应用程序之前 android 菜单中允许该位置,则传感器工作正常。我赶上了事件OnLocationChange。但是,如果我不允许在 Android 菜单中定位并启动应用程序,然后在 Android 菜单中允许定位,则传感器不起作用。

没有调用事件OnLocationChange

设置LocationSensor1.Active := true; 在这种情况下没有帮助。

如何在我的应用程序启动后自动允许定位?

我正在使用Delphi XE10.1 BerlinAndroid 6.0

【问题讨论】:

从计时器事件启动 LocationSensor1 并在之后禁用计时器。并在 FormCreate 事件中启用 Timer 这很奇怪。我自己试过了。我启动了应用程序,它在设计时设置了位置传感器Active,并在设备上禁用了位置设置。然后,当应用程序运行时,我启用了位置设置。果然,正如预期的那样,System.Android.Sensor.pas 中JLocationListener 实现中的onLocationChanged 方法称为TCustomLocationSensor.DoLocationChanged,它又调用了我的位置传感器的OnLocationChanged 事件处理程序。我想知道你的情况有什么不同。您是否尝试过一个简单的独立示例,就像我所做的那样? 我做了一些测试。有时传感器启动有效,但在许多情况下无效。我不明白这种行为。如果我在应用程序启动后立即允许位置,传感器开始工作的机会会更高。位置传感器仍设置为活动! 我在 Android 上运行 Delphi 示例 OrientationSensor 时发现了同样的问题。仅接收到一个 0.00 / NaN 传感器读数。为了处理 API 级别 26 的权限,设计时不能设置 active := true,所以没有办法启动传感器 无法启动传感器是什么意思? 【参考方案1】:

今天解决了同样的问题。在我的情况下,手动设置应用权限完成了这项工作

编辑:手动添加到AndroidManifest.xml:

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

【讨论】:

您能详细解释一下吗? 我修改了答案【参考方案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

当然,这两个权限也必须在项目选项中勾选,但这已经是默认设置了。

【讨论】:

以上是关于如果应用程序启动后允许位置,Delphi Android 位置传感器不起作用的主要内容,如果未能解决你的问题,请参考以下文章

delphi 请问,如何不允许关闭某程序

启动终端程序,但在终端关闭后继续运行 - Lazarus 或 Delphi

用户选择允许后如何处理启用位置服务?

delphi等窗口完全显示后执行一段代码

delphi 控制服务程序,让服务启动失败后总是恢复。

delphi启动快捷键