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();
}
}
我正在使用位置来实现地理围栏功能(将应用程序的使用限制在一个国家/地区)在第一个 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();
}
}