Android位置请求PRIORITY_HIGH_ACCURACY无效

问题描述 投票:5回答:2

我的Android应用需要高精度的位置跟踪。在应用程序启动时,它会以编程方式读取位置设置,并在未选择高精度时显示屏幕。

我将谷歌的官方例子(https://developers.google.com/android/reference/com/google/android/gms/location/SettingsClient)改编为Kotlin。

这在华为手机上有效,但在三星S7和S8上失败:如果用户选择了Power平衡,则会出现一个对话框,并且位置跟踪设置为高精度。但是,如果之前仅选择了GPS,则不会抛出ApiException并且设置保持不变。

val locationRequest = LocationRequest.create()
locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY

val builder = LocationSettingsRequest.Builder().addLocationRequest(locationRequest)
val result = LocationServices.getSettingsClient(this).checkLocationSettings(builder.build())

result.addOnCompleteListener(OnCompleteListener {
    try {
        it.getResult(ApiException::class.java)
        // on Samsung + GPS only setting, execution passes here, no ApiException thrown
    } catch(e: ApiException) {
        if(e is ResolvableApiException) {
            // ...show resolution dialog...
        }
    }
}

任何提示将非常感谢,谢谢:)

android request location setting
2个回答
0
投票

我对s8有同样的问题,所以我检查设备,如果它是我用PRIORITY_BALANCED_POWER_ACCURACY提出请求并且它有效,但有一些延迟。


0
投票

我遇到了同样的问题。我找到了解决方案。

    val locationRequest = LocationRequest.create()
    locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY

    val builder = LocationSettingsRequest.Builder().addLocationRequest(locationRequest)
    val result = LocationServices.getSettingsClient(this).checkLocationSettings(builder.build())

    result.addOnCompleteListener(OnCompleteListener {
        try {
            it.getResult(ApiException::class.java)
            // on Samsung + GPS only setting, execution passes here, no ApiException thrown
            val locationManager = application.getSystemService(Context.LOCATION_SERVICE) as LocationManager
            if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
                AlertDialog.Builder(this@YourActivity)
                        .setMessage("message for user")
                        .setPositiveButton(R.string.ok) { _, _ ->
                            val intent = Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS)
                            [email protected](intent, RC_GPS_LOCATION)
                        }
                        .setNegativeButton(R.string.no_thanks, null)
                        .create()
                        .show()
            } else {
                // your code for High accuracy mode
            }
        } catch (ApiException exception) {
            switch (exception.getStatusCode()) {
                case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                    try {
                        ResolvableApiException resolvable = (ResolvableApiException) exception;
                        resolvable.startResolutionForResult(getActivity(), RC_RESOLVE_LOCATION);
                    } catch (IntentSender.SendIntentException ex) {
                        // Ignore the error.
                    }
                    break;
                case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                    showToast(R.string.sorry_your_device_is_not_supported);
                    break;
            }
        }
    }

请不要忘记处理活动结果。

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        when (requestCode) {
            RC_GPS_LOCATION -> {
                // do action after user closed GPS settings screen
            }
        }
    }

注意:在某些设备上,会启动一个对话框,允许您一键启用GPS。在其他情况下,用户将被重定向到设置屏幕(但这总比没有好)。

© www.soinside.com 2019 - 2024. All rights reserved.