问题描述
最近我一直在尝试实现逻辑,以便每 15 分钟使用工作管理器从 FusedLocationProviderClient 获取位置更新(因为这是最小的后台执行延迟)。但是 FusedLocationProviderClient 的 requestLocationUpdates() 函数每 15 分钟失败一次,我无法从中获得成功结果任务,我总是得到失败的结果。当我从 fusedlocationproviderclient 打印异常时,它只打印“null”?有什么帮助吗?
片段:
private fun addWorker(){
val workRequest = PeriodicWorkRequestBuilder<MyWorker>(15,TimeUnit.MINUTES)
.build()
val workManager = WorkManager.getInstance(requireContext())
workManager.enqueueUniquePeriodicWork(
"MyMainWorker",ExistingPeriodicWorkPolicy.KEEP,workRequest
)
}
工人
class MyWorker(context: Context,wp: WorkerParameters) :
Worker(context,wp) {
private val LOCATION_UPDATE_INTERVAL = TimeUnit.MINUTES.toMillis(4)
private val LOCATION_FASTEST_UPDATE_INTERVAL = TimeUnit.MINUTES.toMillis(2)
private var ctx: Context = context
override fun doWork(): Result {
return if (getLocationUpdate()) {
Log.d("MyWorker","SUCCESS")
Result.success()
} else {
Log.d("MyWorker","FAILURE")
Result.failure()
}
}
@SuppressLint("MissingPermission")
private fun getLocationUpdate(): Boolean {
val fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(ctx)
val locationCallback = object : LocationCallback() {
override fun onLocationResult(result: LocationResult?) {
super.onLocationResult(result)
result?.locations?.let { locations ->
for (location in locations) {
Log.d("MyWorker","NEW Location: $location")
}
}
}
}
val locationRequest = LocationRequest().apply {
interval = LOCATION_UPDATE_INTERVAL
fastestInterval = LOCATION_FASTEST_UPDATE_INTERVAL
priority = LocationRequest.PRIORITY_HIGH_ACCURACY
}
val result = fusedLocationProviderClient.requestLocationUpdates(
locationRequest,locationCallback,Looper.getMainLooper()
)
Log.d("MyWorker",result.exception?.message.toString())
Log.d("MyWorker",result.exception?.cause.toString())
Log.d("MyWorker",result.exception.toString())
return result.isSuccessful
}
I/WM-WorkerWrapper: Worker 结果 FAILURE for Work [ id=3fe5b78d-e0ed-4348-90b6-25c2c1f96bfd,标签={ com.example.testapp.MyWorker } ]
解决方法
注意:Google Play 商店更新了有关设备的政策 位置,限制对需要它的应用程序的后台位置访问 其核心功能并满足相关政策要求。 采用这些最佳做法并不能保证 Google Play 会批准 您的应用在后台使用位置信息。
详细了解与设备位置相关的政策变化。 https://support.google.com/googleplay/android-developer/answer/9799150