工作管理器的位置更新不起作用

Posted

技术标签:

【中文标题】工作管理器的位置更新不起作用【英文标题】:Location Update from Work Manager Doesn't work 【发布时间】:2021-05-13 00:23:58 【问题描述】:

最近我一直在尝试实现逻辑,以便使用工作管理器从 FusedLocationProviderClient 获取位置更新,每 15 分钟一次(因为这是最小的后台执行延迟)。但是 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 ]

【问题讨论】:

【参考方案1】:

注意:Google Play 商店已更新其有关设备的政策 位置,限制后台位置访问需要它的应用程序 核心功能并满足相关政策要求。 采用这些最佳做法并不能保证 Google Play 会批准 您的应用在后台使用位置信息。

详细了解与设备位置相关的政策变更。 https://support.google.com/googleplay/android-developer/answer/9799150

【讨论】:

以上是关于工作管理器的位置更新不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Mongodb位置运算符不起作用

Oreo+ 中位置更新的前台服务不起作用

如果 gps 打开,位置管理器不起作用。如果 gps 打开,它工作正常

正如 Fusion Location Provider API 所声称的那样,位置更新在室内不起作用

当应用程序处于后台并且网络连接丢失时,位置更新计时器不起作用?

Firebase - 跨多个位置的原子写入不起作用