LocationCallback没有被调用

时间:2018-06-15 06:59:39

标签: android google-location-services fusedlocationproviderclient

我正在使用 FusedLocationProviderClient 进行位置请求。我保留了一个计时器30秒,以检查在该时间范围内是否收到位置。 代码如下:

 public void requestLocationUpdates() {
    initializeLocationRequest();
    mFusedLocationProviderClient.requestLocationUpdates(mLocationRequest, mLocationCallback, null);
    startTimer();
}

 private void initializeLocationRequest() {
    mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(mContext);
    mLocationRequest = new LocationRequest();
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    mLocationRequest.setInterval(5000);
    mLocationRequest.setFastestInterval(5000);

    mLocationCallback = new LocationCallback() {

        @Override
        public void onLocationResult(LocationResult locationResult) {
            synchronized (SilentCurrentLocationProvider.this) {
                super.onLocationResult(locationResult);
                Location location = locationResult.getLastLocation();
        }
    };
}

  private void startTimer() {
    if (mTimeout < 1) {
        mTimeout = mDefaultTimeout;
    }
    mTimer = new Timer();   
    mTimer.schedule(new LocationTimer(), mTimeout * 1000);
}

在少数设备上,位置不会到来。在进一步调试时,我发现正在创建 LocationRequest LocationCallback ,但它不会进入 onLocationResult()方法。

由于这是实时产品的一部分,因此很难在每台设备上进行调试。 即使我尝试重新启动手机,但它无法正常工作。用户尝试了其他应用程序,如Ola和位置即将到来。

位置权限也已提供

有谁可以告诉我这个问题的可能原因?

5 个答案:

答案 0 :(得分:3)

您只需要请求以下权限:

Manifest.permission.ACCESS_FINE_LOCATION

我遇到了同样的问题,并且同时要求使用以下两个权限:

Manifest.permission.ACCESS_COARSE_LOCATION

当我删除粗略位置后,我几乎立即获得了更新。

答案 1 :(得分:1)

我也面临着同样的问题。在我的情况下,设备定位方法/准确性设置为仅手机,而不是高精度省电。将设置更改为高精度,并在locationCallback上接收回调。

答案 2 :(得分:1)

在装有Android Pie的手机上也有同样的问题。授予了位置许可(通常通过转到应用程序设置),并且位置信息的准确性很高,但未获得位置更新。 在我添加代码以检查请求位置更新之前是否已授予位置权限后,此问题已解决。

if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.ACCESS_FINE_LOCATION)
        != PackageManager.PERMISSION_GRANTED) {
    // Permission is not granted. Request for permission
}

答案 3 :(得分:1)

关闭位置后,这发生在我身上。不是应用程序的位置权限,而是android设备本身的位置。要求用户激活GPS为我修复它:

protected void onCreate(Bundle savedInstanceState) {
    //...
    final LocationManager manager = (LocationManager) getSystemService( Context.LOCATION_SERVICE );

    if ( !manager.isProviderEnabled( LocationManager.GPS_PROVIDER ) ) {
        buildAlertMessageNoGps();
    }
}

private void buildAlertMessageNoGps() {
    final AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("Your GPS seems to be disabled, do you want to enable it?")
            .setCancelable(false)
            .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                public void onClick(@SuppressWarnings("unused") final DialogInterface dialog, @SuppressWarnings("unused") final int id) {
                    startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
                }
            })
            .setNegativeButton("No", new DialogInterface.OnClickListener() {
                public void onClick(final DialogInterface dialog, @SuppressWarnings("unused") final int id) {
                    dialog.cancel();
                }
            });
    final AlertDialog alert = builder.create();
    alert.show();
}

来自here的解决方案。

您可能还需要先关闭GPS,然后再打开,以触发对话框以提高定位精度:

Dialog prompting to improve location accuracy

答案 4 :(得分:0)

尝试将LocationCallback放置为“ onCreate()”方法。