Android LocationServices.checkLocationSettings 假阴性结果

标签 android location google-play-services

到目前为止受影响的设备:

  • Xperia 1 II
  • 小米红米 Note 7

使用: 为了请求位置更新,我检查了位置设置 事先是足够的。如果没有,我会显示一个小文本,表示服务必须 为我的功能启用。如果用户点击它,系统对话框启用 将提示定位服务。

我如何进行检查: 我通过 LocationSettingsRequestLocationServices 运行检查,并且 处理 ResolvableApiException。如果服务被用户禁用, 然后在我所有的设备上,这将显示系统对话框,要求用户启用 服务(并启用它,如果单击确定)。

在 Redmi 上发生了什么: 但无论出于何种原因,在 Xiamoi Redmi Note 7 上,checkLocationSettings总是返回一个ResolvableApiException,即使服务 已经启用。对话框不会出现,直接返回肯定结果 (当然,因为该服务已启用)。 因此,用户会卡住并永远点击“启用”。

有人知道为什么 LocationSettingsRequest 不工作吗 正确地安装在这些设备上并知道如何修复它?

示例代码 fragment

void enableLocationSettings(onLocationServiceRequiredCallback: ICallback) {
   LocationRequest locationRequest = LocationRequest.create()
         .setInterval(LOCATION_UPDATE_INTERVAL)
         .setExpirationDuration(LOCATION_UPDATE_EXPIRATION_DURATION)
         .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
            .addLocationRequest(locationRequest);

    LocationServices
            .getSettingsClient(this)
            .checkLocationSettings(builder.build())
            .addOnSuccessListener(this, (LocationSettingsResponse response) -> {
                // update location as usual
            })
            .addOnFailureListener(this, error -> {
                if (error instanceOf ApiException) {
                    int statusCode = error.statusCode;
                    if(statusCode == LocationSettingsStatusCodes.RESOLUTION_REQUIRED) {
                        if(error instanceOf ResolvableApiException) {
                            PendingIntent resolution = error.resolution 
             // This will trigger the system dialog, see below
                            onLocationServiceRequiredCallback(resolution);
                        }
                    }
                }
                // error callback
            });  

 

不幸的是,回调代码现在将是 kotlin。对不起。我只能发布“示例代码 fragment ”,因为这是与工作相关的。

它使用 ActivityResultContracts.StartIntentSenderForResult 开始 系统对话框。

resolution 是上面的 PendingIntent。

契约(Contract):

private val locationServiceContract = registerForActivityResult(
    ActivityResultContracts.StartIntentSenderForResult()
) { activityResult ->
    lifecycleScope.launchWhenResumed {
        val result = if (activityResult.resultCode == Activity.RESULT_OK) {
            // This will retrigger the location fetch (looping)
            enableLocationSettings(...) 
        } else {
            // Do nothing
        }
    }
}

调用上面的回调后,将执行:

        locationServiceContract.launch(
            IntentSenderRequest.Builder(
                resolution
            ).build()
        )

LocationSettingsStates 的转储,使用已弃用的 LocationSettings API(使用 GoogleApiClient)获取:

isGpsPresent: true, 
isGpsUsable: false, 
isLocationPresent: true, 
isLocationUsable: true, 
isNetworkLocationPresent: true, 
isNetworkLocationUsable: true 

最佳答案

您好,我使用不同的代码来检查设备上是否启用了 GPS。也许值得您尝试一下,看看它是否能解决您的问题。

 private boolean isLocationEnabled(Context context) {
        LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
        return LocationManagerCompat.isLocationEnabled(locationManager);
    }

然后我使用对话框将用户发送到设置

Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
context.startActivity(intent);

我打赌你也在做同样的事情。在发送用户启用 GPS 后,您可以在恢复时再次运行该方法

如果有帮助请告诉我

关于Android LocationServices.checkLocationSettings 假阴性结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69649666/

相关文章:

android - 如何在我的应用程序 android 上检查我的互联网访问

android - Android 的自定义 ListView 适配器 - 如何在 getView() 中获得正确的 View ?

android - 在每个特定值android之后显示一个对话框

angularjs - 使用 AngularJS 重定向

android - 如何以编程方式访问 google-services.json 中的 Google API key

java - 真实注销BaseGameActivity

android - jQuery Mobile UI 无法与 IBM Worklight 一起正常工作

android - 更改应用程序区域设置后如何获取设备区域设置

iphone - 从 XCode 中的 SQLite 数据库获取一定半径内的所有位置

android - 如何使用 Android Studio 为同一项目中的不同谷歌服务集成两个或多个 google-services.json 文件