我正在尝试创建一个前台服务,该服务可以使用手机的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 中正确显示了通知,因此该服务肯定正在运行,但无论如何我似乎都没有获得任何位置更新。问题可能是什么?谢谢。
您没有共享太多代码,因此我将分享一些猜测作为答案建议:
- 位置 API 选择:
您正在创建一个FusedLocationProviderClient
,但不使用它。根据此文档和此SO帖子,由于准确性和电池使用量,最好使用此提供商而不是LocationManager
。尝试使用FusedLocationProviderClient
中的requestLocationUpdates
。此处为其他示例。
- 侦听器定义:
根据这段代码:
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER, 2000, 0F, locationListener
)
您正在尝试使用此方法的重载,然后使用定义该方法的线程的Looper
。如果侦听器不是在服务中创建的,则它可能使用无法从服务线程访问的Looper
。
确保您在onStartCommand
中呼叫startForeground(id, notification)
,并且服务保持活动状态(示例)。
另请查看此存储库,了解在前台服务中访问的位置服务的示例。通读这篇文章以获取更多参考。