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。解决问题的关键是在位置和地图工具包集成中删除当前位置调用。

  1. 调用函数removeLocationUpdates(locationCallback)移除HMS Location Kit位置更新。您和其他发布的答案已经完成。

  2. 移除 HMS Map kit 调用获取当前位置:

    hMap.setMyLocationEnabled(假);

为了删除顶部状态栏上的 GPS 图标,您的代码缺少此内容。

如果上述建议解决了您的问题,请告诉我们。顺便说一句,此解决方案已在我的开发计算机上使用华为 Mate 30 Pro 进行了验证。