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

时间:2021-02-09 11:11:34

标签: android kotlin android-workmanager android-fusedlocation

最近我一直在尝试实现逻辑,以便每 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 } ]

1 个答案:

答案 0 :(得分:0)

<块引用>

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

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