Location 转向时 FusedLocationProviderClient 无法正常工作 on/off

FusedLocationProviderClient not working correctly when Location turned on/off

我正在使用位置来实现地理围栏功能(将应用程序的使用限制在一个国家/地区)在第一个 activity 应用程序中,我使用 FusedLocationProviderClient 来获取这样的位置:

初始化部分

fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);

和位置部分

fusedLocationClient.getLastLocation().addOnSuccessListener(this, location -> {
                if (location != null) {
                    //geofencing logic
                }
            });

如果设备上始终启用位置,则此代码可以正常工作。如果用户在 phone 顶部的快捷菜单或设置中禁用位置并尝试进入应用程序,它会收到位置已禁用并退出的消息。之后,如果用户尝试打开位置并输入应用程序,FusedLocationClient 会卡住并且根本没有 return 位置。之后它只有在我重新安装应用程序时才会起作用。有没有人遇到过这个问题并试图解决它,而不是一直使用后台定位并定期更新?

PS 如果我尝试直接使用 LocationService 访问最后已知的位置,也会发生同样的事情。

您可以获取特定时间间隔内的位置更新,而不是获取最后的已知位置。这是代码。

声明这些融合位置提供程序 class 和位置回调 class

private var mFusedLocationProviderClient: FusedLocationProviderClient? = null
private var mLocationRequest: LocationRequest? = null
private var mLocationCallback: LocationCallback? = null  
private const val LOCATION_REQUEST_INTERVAL: Long = 5000

`

这是定位请求的必要方法

private fun createLocationRequest() {
    mLocationRequest = LocationRequest.create()
    mLocationRequest!!.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
    mLocationRequest!!.setInterval(LOCATION_REQUEST_INTERVAL).fastestInterval =
    LOCATION_REQUEST_INTERVAL
    requestLocationUpdate()
}

private fun requestLocationUpdate() {
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
        != PackageManager.PERMISSION_GRANTED ) {

        Log.e("permission", "denied");


        // TODO: Consider calling
        //    ActivityCompat#requestPermissions
        // here to request the missing permissions, and then overriding
        //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
        //                                          int[] grantResults)
        // to handle the case where the user grants the permission. See the documentation
        // for ActivityCompat#requestPermissions for more details.
        return
    }

    mFusedLocationProviderClient!!.requestLocationUpdates(
        mLocationRequest,
        mLocationCallback,
        Looper.myLooper()
    )
}

然后在 onCreate() 中调用这些“createLocationRequest”方法和位置回调 class。

    mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(requireContext())

 createLocationRequest()
 mLocationCallback = object : LocationCallback() {

        override fun onLocationResult(locationResult: LocationResult) {
            super.onLocationResult(locationResult)
             val lat  = locationResult.lastLocation.latitude
             val lng = locationResult.lastLocation.longitude
                                
     
        }
    }

并根据您的要求在 onPause() 或 onDestory() 中删除位置更新侦听器。

    mFusedLocationProviderClient!!.removeLocationUpdates(mLocationCallback)

场景 1:在收到位置已禁用的消息后,exits.kill 来自最近应用托盘的应用现在启用位置。然后从主页以新 Activity 打开应用程序,现在它应该更新位置。如果它正常工作,App.App 没有任何问题正常工作。

场景 2:如果你在 onCreate() 方法中有 fusedLocation.getLastLocation(),当你打开来自最近应用程序托盘的应用程序,将首先调用 onStart() 方法,然后调用 onResume() 而不是 onCreate()。现在启用位置,从最近应用程序托盘打开应用程序,检查位置是否更新。

   @Override
protected void onResume() {
    super.onResume();
    if (isLocationServiceEnabled) {
        startLocationUpdates();
    }
}