2

我正在使用华为定位套件。我有一个问题,即 GPS 位置图标始终在通知栏中,即使我有此功能来停止请求位置更新。

private fun stopLocationUpdates() {
    fusedLocationProviderClientClient.removeLocationUpdates(locationCallback)
}

我在 onPause() 中调用函数

override fun onPause() {
    super.onPause()
    stopLocationUpdates()
}

现在,当我从当前片段中弹出BackStack 时, 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()
    }
}
4

3 回答 3

1

您在顶部状态栏上显示 GPS 图标的问题可以在我使用华为 HMS 定位套件和地图套件开发的演示应用程序中重现。查看您发布的代码,您一直在使用 HMS 位置和地图套件。解决问题的关键是在位置和地图套件集成中删除当前位置调用。

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

  2. 通过调用删除 HMS 地图工具包获取当前位置:

    hMap.setMyLocationEnabled(false);

这是为了删除顶部状态栏上的 GPS 图标而缺少的代码。

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

于 2021-01-27T05:10:51.357 回答
0

建议removeLocationUpdates() 在销毁时也调用 onDestroy 状态。

  override fun onDestroy() {
        //Removed when the location update is no longer required.
        stopLocationUpdates()
        super.onDestroy()
    }

您还可以参考此链接了解 Activity 的状态路径。

希望这可以帮助您解决问题。

于 2021-01-22T08:01:28.760 回答
0

您想让通知上的 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());
    }
}
于 2021-01-22T09:02:30.217 回答