如果应用程序启动后允许位置,Delphi Android 位置传感器不起作用
Posted
技术标签:
【中文标题】如果应用程序启动后允许位置,Delphi Android 位置传感器不起作用【英文标题】:Delphi Android Location Sensor not working if location allowed after application start 【发布时间】:2017-02-10 00:28:39 【问题描述】:我对@987654321@ 有一个有趣的问题。如果在我启动应用程序之前 android 菜单中允许该位置,则传感器工作正常。我赶上了事件OnLocationChange
。但是,如果我不允许在 Android 菜单中定位并启动应用程序,然后在 Android 菜单中允许定位,则传感器不起作用。
没有调用事件OnLocationChange
。
设置LocationSensor1.Active := true;
在这种情况下没有帮助。
如何在我的应用程序启动后自动允许定位?
我正在使用Delphi XE10.1 Berlin
和Android 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 位置传感器不起作用的主要内容,如果未能解决你的问题,请参考以下文章