Huawei Location Kit - requestLocationUpdates 即使调用 removeLocationUpdates 也不会停止
Huawei Location Kit - requestLocationUpdates does not stop even removeLocationUpdates was called
我正在使用华为定位服务。我有一个问题,GPS 位置图标总是在通知栏中,即使我有这个功能来停止请求位置更新。
private fun stopLocationUpdates() {
fusedLocationProviderClientClient.removeLocationUpdates(locationCallback)
}
我调用onPause()里面的函数
override fun onPause() {
super.onPause()
stopLocationUpdates()
}
现在,当我从当前片段中 popBackStack 时,removeLocationUpdates(locationCallback) 可以工作。 GPS 位置图标从通知中消失。但是,当我从当前片段导航到另一个片段时,即使从 onPause 执行了 removeLocationUpdates(locationCallback),通知上的 gps 位置图标也不会消失。停止请求的唯一方法是关闭最近使用的应用程序中的应用程序。
有谁知道原因吗?
这是我的一些其他代码:
private var fusedLocationProviderClientClient: FusedLocationProviderClient? = null
private var locationRequest: LocationRequest? = null
private var locationCallback: LocationCallback? = null
private var huaweiMap: HuaweiMap? = null
private fun prepareLocation() {
locationRequest
?: LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY)
.setInterval(30000)
.setFastestInterval(10000)
.setSmallestDisplacement(250.toFloat())
.also {
locationRequest = it }
locationCallback
?: object :
LocationCallback() {
override fun onLocationResult(
locationResult: LocationResult?
) {
locationResult
?: return
locationResult.lastLocation
?: return
currentLocation = LatLng(
locationResult.lastLocation.latitude, locationResult.lastLocation.longitude
)
}
override fun onLocationAvailability(
locationAvailability: LocationAvailability?
) {
}
}.also {
locationCallback = it }
fusedLocationProviderClientClient
?: LocationServices.getFusedLocationProviderClient(requireActivity())
.also {
fusedLocationProviderClientClient = it }
}
private fun requestLocationUpdates() {
locationClient?.requestLocationUpdates(locationRequest, locationCallback, null)
}
我在 onMapReady() 中调用了 requestLocationUpdates
override fun onMapReady(hMap: HuaweiMap?) {
// if maps is not yet initialized
if (huaweiMap == null ) {
huaweiMap = hMap
prepareLocation()
checkPermissionThenRequestLocation()
}
else {
//insert code
}
}
private fun checkPermissionThenRequestLocation() {
if (!(isFineLocationGranted && isCoarseLocationGranted)) {
val permissions = arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION
)
requestPermissions(
permissions, MainActivity.PERMISSION_REQ_CODE_LOCATION
)
} else {
requestLocationUpdates()
}
}
建议在销毁时也调用removeLocationUpdates()
onDestroy状态
override fun onDestroy() {
//Removed when the location update is no longer required.
stopLocationUpdates()
super.onDestroy()
}
您也可以参考此 link 以获得 Activity 的状态路径。
希望这对您的问题有所帮助。
您要让通知上的 gps 位置图标消失吗?
在运行stopLocationUpdates()之后,是否收到新位置回调,让你通知更新?您是否使用 NotificationManager 显示通知?
如果没有新的位置回调和之后,您可以直接关闭通知。
boolean isLocationSettingOk = false;
@Override
public void onPause() {
super.onPause();
removeLocationUpdatesWithCallback();
}
@Override
protected void onRestart() {
super.onRestart();
addLoationCallback();
}
@Override
public void onMapReady(HuaweiMap huaweiMap) {
hMap = huaweiMap;
hMap.setMyLocationEnabled(true);
hMap.getUiSettings().setMyLocationButtonEnabled(true);
initHwLoction();
}
public void initHwLoction() {
fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
mLocationRequest = new LocationRequest();
SettingsClient settingsClient = LocationServices.getSettingsClient(this);
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
builder.addLocationRequest(mLocationRequest);
LocationSettingsRequest locationSettingsRequest = builder.build();
settingsClient.checkLocationSettings(locationSettingsRequest)
.addOnSuccessListener(new OnSuccessListener<LocationSettingsResponse>() {
@Override
public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
isLocationSettingOk = true;
addLoationCallback();
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
e.printStackTrace();
}
});
}
private void addLoationCallback() {
if (isLocationSettingOk)
fusedLocationProviderClient.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.getMainLooper())
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
//接口调用成功的处理
Log.d(TAG, "onSuccess: " + aVoid);
}
});
}
public void removeLocationUpdatesWithCallback() {
try {
Task<Void> voidTask = fusedLocationProviderClient.removeLocationUpdates(mLocationCallback);
voidTask.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Log.i(TAG, "removeLocationUpdatesWithCallback onSuccess");
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
Log.e(TAG, "onFailure:" + e.getMessage());
}
});
} catch (Exception e) {
Log.e(TAG, "exception:" + e.getMessage());
}
}
在我使用华为HMS Location Kit 和Map Kit 开发的演示应用程序中,可以重现您在顶部状态栏上显示GPS 图标的问题。查看您发布的代码,您一直在使用 HMS Location 和 Map kit。解决问题的关键是在位置和地图工具包集成中删除当前位置调用。
调用函数removeLocationUpdates(locationCallback)移除HMS Location Kit位置更新。您和其他发布的答案已经完成。
移除 HMS Map kit 调用获取当前位置:
hMap.setMyLocationEnabled(假);
为了删除顶部状态栏上的 GPS 图标,您的代码缺少此内容。
如果上述建议解决了您的问题,请告诉我们。顺便说一句,此解决方案已在我的开发计算机上使用华为 Mate 30 Pro 进行了验证。
我正在使用华为定位服务。我有一个问题,GPS 位置图标总是在通知栏中,即使我有这个功能来停止请求位置更新。
private fun stopLocationUpdates() {
fusedLocationProviderClientClient.removeLocationUpdates(locationCallback)
}
我调用onPause()里面的函数
override fun onPause() {
super.onPause()
stopLocationUpdates()
}
现在,当我从当前片段中 popBackStack 时,removeLocationUpdates(locationCallback) 可以工作。 GPS 位置图标从通知中消失。但是,当我从当前片段导航到另一个片段时,即使从 onPause 执行了 removeLocationUpdates(locationCallback),通知上的 gps 位置图标也不会消失。停止请求的唯一方法是关闭最近使用的应用程序中的应用程序。
有谁知道原因吗?
这是我的一些其他代码:
private var fusedLocationProviderClientClient: FusedLocationProviderClient? = null
private var locationRequest: LocationRequest? = null
private var locationCallback: LocationCallback? = null
private var huaweiMap: HuaweiMap? = null
private fun prepareLocation() {
locationRequest
?: LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY)
.setInterval(30000)
.setFastestInterval(10000)
.setSmallestDisplacement(250.toFloat())
.also {
locationRequest = it }
locationCallback
?: object :
LocationCallback() {
override fun onLocationResult(
locationResult: LocationResult?
) {
locationResult
?: return
locationResult.lastLocation
?: return
currentLocation = LatLng(
locationResult.lastLocation.latitude, locationResult.lastLocation.longitude
)
}
override fun onLocationAvailability(
locationAvailability: LocationAvailability?
) {
}
}.also {
locationCallback = it }
fusedLocationProviderClientClient
?: LocationServices.getFusedLocationProviderClient(requireActivity())
.also {
fusedLocationProviderClientClient = it }
}
private fun requestLocationUpdates() {
locationClient?.requestLocationUpdates(locationRequest, locationCallback, null)
}
我在 onMapReady() 中调用了 requestLocationUpdates
override fun onMapReady(hMap: HuaweiMap?) {
// if maps is not yet initialized
if (huaweiMap == null ) {
huaweiMap = hMap
prepareLocation()
checkPermissionThenRequestLocation()
}
else {
//insert code
}
}
private fun checkPermissionThenRequestLocation() {
if (!(isFineLocationGranted && isCoarseLocationGranted)) {
val permissions = arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION
)
requestPermissions(
permissions, MainActivity.PERMISSION_REQ_CODE_LOCATION
)
} else {
requestLocationUpdates()
}
}
建议在销毁时也调用removeLocationUpdates()
onDestroy状态
override fun onDestroy() {
//Removed when the location update is no longer required.
stopLocationUpdates()
super.onDestroy()
}
您也可以参考此 link 以获得 Activity 的状态路径。
希望这对您的问题有所帮助。
您要让通知上的 gps 位置图标消失吗?
在运行stopLocationUpdates()之后,是否收到新位置回调,让你通知更新?您是否使用 NotificationManager 显示通知?
如果没有新的位置回调和之后,您可以直接关闭通知。
boolean isLocationSettingOk = false;
@Override
public void onPause() {
super.onPause();
removeLocationUpdatesWithCallback();
}
@Override
protected void onRestart() {
super.onRestart();
addLoationCallback();
}
@Override
public void onMapReady(HuaweiMap huaweiMap) {
hMap = huaweiMap;
hMap.setMyLocationEnabled(true);
hMap.getUiSettings().setMyLocationButtonEnabled(true);
initHwLoction();
}
public void initHwLoction() {
fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
mLocationRequest = new LocationRequest();
SettingsClient settingsClient = LocationServices.getSettingsClient(this);
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
builder.addLocationRequest(mLocationRequest);
LocationSettingsRequest locationSettingsRequest = builder.build();
settingsClient.checkLocationSettings(locationSettingsRequest)
.addOnSuccessListener(new OnSuccessListener<LocationSettingsResponse>() {
@Override
public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
isLocationSettingOk = true;
addLoationCallback();
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
e.printStackTrace();
}
});
}
private void addLoationCallback() {
if (isLocationSettingOk)
fusedLocationProviderClient.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.getMainLooper())
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
//接口调用成功的处理
Log.d(TAG, "onSuccess: " + aVoid);
}
});
}
public void removeLocationUpdatesWithCallback() {
try {
Task<Void> voidTask = fusedLocationProviderClient.removeLocationUpdates(mLocationCallback);
voidTask.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Log.i(TAG, "removeLocationUpdatesWithCallback onSuccess");
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
Log.e(TAG, "onFailure:" + e.getMessage());
}
});
} catch (Exception e) {
Log.e(TAG, "exception:" + e.getMessage());
}
}
在我使用华为HMS Location Kit 和Map Kit 开发的演示应用程序中,可以重现您在顶部状态栏上显示GPS 图标的问题。查看您发布的代码,您一直在使用 HMS Location 和 Map kit。解决问题的关键是在位置和地图工具包集成中删除当前位置调用。
调用函数removeLocationUpdates(locationCallback)移除HMS Location Kit位置更新。您和其他发布的答案已经完成。
移除 HMS Map kit 调用获取当前位置:
hMap.setMyLocationEnabled(假);
为了删除顶部状态栏上的 GPS 图标,您的代码缺少此内容。
如果上述建议解决了您的问题,请告诉我们。顺便说一句,此解决方案已在我的开发计算机上使用华为 Mate 30 Pro 进行了验证。