【问题标题】:Use onLocationChanged() updates inside a foreground service在前台服务中使用 onLocationChanged() 更新
【发布时间】:2021-10-28 04:37:25
【问题描述】:

我正在尝试创建一个前台服务,该服务可以使用手机的 GPS 跟踪用户的位置。我有一个ForegroundService 类,在onCreate() 方法中我调用了一个函数,该函数应该从请求位置更新开始:

fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this)

locationManager = getSystemService(LOCATION_SERVICE) as LocationManager

val locationListener: LocationListener = this
locationManager.requestLocationUpdates(
    LocationManager.GPS_PROVIDER, 2000, 0F, locationListener
)

我的班级正在实施Service()LocationListener。然后我覆盖onLocationChanged,我应该在其中记录当前速度(并将onAccuracyChanged留空)。

当然,我在 android 中正确显示了一个通知,所以该服务肯定正在运行,但我似乎没有得到任何位置更新。问题可能是什么?谢谢。

【问题讨论】:

  • 您是否请求了位置的运行时权限?我在那里看不到它,所以我假设没有。您还需要在清单中请求静态权限。
  • @GabeSechan 是的,并且在请求更新之前检查它们是否已被接受。我尝试用于前台服务的代码在正常活动中工作,屏幕打开等。
  • 用户是否授予后台位置收集权限?在现代 Android 中,用户可以选择在应用程序仅在前台时允许收集位置。即使您的应用在前台,在 Service 中运行也算作后台。
  • @GabeSechan 是的,也完成了。
  • 在 Activity(前台)中运行时,您提供的相同代码是否有效?

标签: java android kotlin gps location


【解决方案1】:

你没有分享太多代码,所以我将分享一些猜测作为答案建议:

  1. 位置 API 选择:

您正在创建一个FusedLocationProviderClient,但没有使用它。根据this docsthis SO post 的说法,由于准确性和电池使用情况,最好使用此提供程序而不是LocationManager。尝试使用来自FusedLocationProviderClientrequestLocationUpdates。附加示例here


  1. 监听器定义:

根据这段代码:

locationManager.requestLocationUpdates(
    LocationManager.GPS_PROVIDER, 2000, 0F, locationListener
)

您正在尝试使用this overloadthis method,然后使用定义它的线程的Looper。如果侦听器不是在服务中创建的,它可能会使用无法从服务线程访问的Looper


确保您在onStartCommand 中调用startForeground(id, notification),并且该服务保持活动状态 (example)。

还可以查看this repo 以获取在前台服务中访问的位置服务示例。阅读this post 以获取更多参考。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 2020-10-01
    • 2019-10-26
    相关资源
    最近更新 更多