尝试获取位置时避免Google提示

时间:2019-06-08 22:31:45

标签: android flutter location google-location-services

我正在使用Flutter的location插件开发一个简单的应用程序,其中包含一些基于their sample code的代码:

var location = new Location();
try {
  _currentLocation = await location.getLocation();
} on PlatformException catch (e) {
  if (e.code == 'PERMISSION_DENIED') {
    _locationMsg = 'Permission denied';
  }
  _currentLocation = null;
}

如插件页面所示,我在Android清单中添加了ACCESS_FINE_LOCATION

问题是,当我在手机上测试该应用程序时(如果相关,请使用Android 9进行测试),即使启用了位置 并且我有GPS信号,也会执行上述代码结果在以下提示中:

Prompt about enabling Google's location service

提示符显示为:“为了获得更好的体验,请打开使用Google位置服务的设备位置。” ,其中有两个按钮:“不谢谢” 和< em>“确定” 。

这太糟糕了,用户不友好:位置已经来自GPS,因此无需进一步打扰用户。

问题出在哪里,如何避免出现此提示?与显示提示相比,我更喜欢报告“未知位置”。

编辑:请注意,与无关提示用户将使用该位置,但这是一项侵犯Google隐私的功能,当您单击“确定”,启用Google位置准确度,如下所述(在“设置”菜单中深层隐藏):

Google Location Accuracy description

上面的图像显示为:使用切换按钮,“提高位置准确性”。 Google定位精度:Google的定位服务通过使用Wi‑Fi和移动网络帮助估算您的位置,从而提高了定位精度。开启设备后,匿名位置数据将发送到Google。

单击第一个提示将启用此功能,然后,如果用户不想将其位置数据发送给Google,则必须手动禁用它。禁用它并尝试再次获取位置会导致出现相同的提示,因此,它绝对与警告用户有关位置数据的使用无关。另外,如果使用该应用程序之前启用了Google定位准确度,则提示永远不会出现在首位,这可能就是为什么大多数开发人员从未注意到它的原因。

我知道有可能无需获取位置数据,因为大多数应用程序都会启用该功能。但是我不知道提示来自哪里:Flutter的位置插件吗?我使用的是Android 9 SDK?还是示例代码?

2 个答案:

答案 0 :(得分:0)

问题似乎出在location插件上。我尝试用geolocator替换它,并修改了调用者代码,但是这次没有出现这样的提示。

我试图在请求位置之前降低准确性,但是location插件仍然显示提示。在任何情况下,都必须有一些底层代码来强制要求Google定位准确性。

如果只有Google会提供一种通过系统的方式永久禁用提示的方法 “否”(这在多个Android版本中都是一个问题),我可能会给他们带来怀疑的好处。

答案 1 :(得分:0)

我今天遇到了同样的问题,但通过定位有问题的表达式并添加了一个 if 语句来检查应用的位置权限是否被授予,从而解决了这个问题。

这是我在 Kotlin 中的代码,有问题的表达式在注释下全部大写:

private fun checkLocationPermission() : Boolean = (ContextCompat.checkSelfPermission(
        requireContext(), ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)

private fun startLocationRequests() {
    val locationRequest = LocationRequest.create()?.apply {
        interval = 10000
        fastestInterval = 5000
        priority = LocationRequest.PRIORITY_HIGH_ACCURACY
    }

    val builder = LocationSettingsRequest.Builder().addLocationRequest(locationRequest!!)
    val client: SettingsClient = LocationServices.getSettingsClient(requireActivity())
    val task: Task<LocationSettingsResponse> = client.checkLocationSettings(builder.build())

    task.addOnSuccessListener { locationSettingsResponse ->
        // All location settings are satisfied. The client can initialize
        // location requests here.
        // ...

        if (checkLocationPermission()) {
            locationPermissionGranted = true
            fusedLocationProviderClient.requestLocationUpdates(
                    locationRequest, locationCallback, Looper.getMainLooper())
        }
    }

    task.addOnFailureListener { exception ->
        if (exception is ResolvableApiException){
            // Location settings are not satisfied, but this can be fixed
            // by showing the user a dialog.
            try {
                // Show the dialog by calling startResolutionForResult(),
                // and check the result in onActivityResult().
                // IF STATEMENT THAT PREVENTS THE DIALOG FROM PROMPTING.
                    if (checkLocationPermission()) { 
                        exception.startResolutionForResult(
                            requireActivity(),
                            REQUEST_CHECK_SETTINGS
                        )
                    }
            } catch (sendEx: IntentSender.SendIntentException) {
                // Ignore the error.
            }
        }
        Timber.i("Location Listener failed")
    }
}

现在我的解决方案可能并不完全适用于您的问题,但我认为应该足以学习解决您的问题。不过,在请求用户位置时,您可能需要重做代码。

此外,我不太确定是否使用 Flutter 的位置插件,但在您和其他人的情况下,我建议在请求用户位置时遵循开发人员文档。也许它也适用于 Flutter: https://developer.android.com/training/location/change-location-settings