为什么FusedLocationApi.getLastLocation为null

Can*_*ğlu 36 android android-location android-4.4-kitkat fusedlocationproviderapi android-fusedlocation

我试图通过使用获取位置FusedLocationApi.getLastLocation,我在清单文件中获得了位置权限:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
Run Code Online (Sandbox Code Playgroud)

但是,null当我从系统请求位置时,我得到了.我只是测试关闭和位置服务,所以它可能与此有关(当然,当我尝试这个时它是开启的).但即使在返回null之后,我也在等待onLocationChanged被调用,而且它从未被调用过.我在这里也看到了类似的问题:FusedLocationApi.getLastLocation总是为null

这是我的代码:

 protected LocationRequest createLocationRequest() {
    LocationRequest mLocationRequest = new LocationRequest();
    mLocationRequest.setInterval(120000);
    mLocationRequest.setFastestInterval(30000);
    mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
    return mLocationRequest;
}

protected GoogleApiClient getLocationApiClient(){
    return new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(LocationServices.API)
            .build();
}

LocationRequest locationRequest = createLocationRequest(); 

@Override
public void onLocationChanged(Location location) {
    App.setLocation(location); // NEVER CALLED
}

@Override
public void onConnected(Bundle bundle) {
    App.setLocation(LocationServices.FusedLocationApi.getLastLocation(locationApiClient)); //RETURNS NULL
    LocationRequest locationRequest = createLocationRequest();
    LocationServices.FusedLocationApi.requestLocationUpdates(locationApiClient, locationRequest, this);
}
Run Code Online (Sandbox Code Playgroud)

onCreate我的应用程序上:

locationApiClient = getLocationApiClient();
locationApiClient.connect();
Run Code Online (Sandbox Code Playgroud)

this我的应用程序对象在哪里.为什么我会得到空(是的,我知道它可能是在文件中规定了一些罕见的情况下是空的,但我总是得到这个,不是很少)此后仍然没有得到位置更新?这是一个没有SIM卡的真实设备(三星Galaxy S3),如果有帮助的话.

Rav*_*ari 18

我在我的应用程序中使用FusedLocationProvider api,这是我的代码在设备和模拟器上都有效 -

  @Override
  protected void onCreate(Bundle savedInstanceState){
     //put your code here
     ....
     getLocation();

  }

 private void getLocation(){
    locationRequest = LocationRequest.create();
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    locationRequest.setInterval(LOCATION_INTERVAL);
    locationRequest.setFastestInterval(LOCATION_INTERVAL);
    fusedLocationProviderApi = LocationServices.FusedLocationApi;
    googleApiClient = new GoogleApiClient.Builder(this)
    .addApi(LocationServices.API)
    .addConnectionCallbacks(this)
    .addOnConnectionFailedListener(this)
    .build();
    if (googleApiClient != null) {
        googleApiClient.connect();
    }
}


   @Override
   public void onConnected(Bundle arg0) {
        fusedLocationProviderApi.requestLocationUpdates(googleApiClient,  locationRequest, this);
   }

   @Override
   public void onLocationChanged(Location location) {
        Toast.makeText(mContext, "location :"+location.getLatitude()+" , "+location.getLongitude(), Toast.LENGTH_SHORT).show();
    }
Run Code Online (Sandbox Code Playgroud)

这是我的工作代码.

希望我的代码可以帮到你.

干杯..

  • 请注意,您需要实现GoogleApiClient.ConnectionCallbacks和com.google.android.gms.location.LocationListener (6认同)
  • @AlexeyStrakh是的.当应用启动时,googleApiClient的lastLocation对象为null.因此,调用null对象上的最后一个位置将返回null,因此应首先更新位置来改进算法,然后当googleApiClient获取当前位置时,继续询问它.小心,如果位置没有改变,onLocationChanged将不会被触发. (2认同)
  • 你甚至不使用fusedLocationProviderApi ...问题是"为什么FusedLocationApi.getLastLocation null"而不是"如何在没有FusedLocationApil的情况下更新位置" (2认同)

Ami*_*aha 18

如果至少有一个客户端连接到融合位置提供程序,则它仅保留后台位置.现在只需打开位置服务,就无法保证存储最后一个已知位置.

一旦第一个客户端连接,它将立即尝试获取位置.如果您的活动是第一个连接的客户端,并且在onConnected()中立即调用了getLastLocation(),那么第一个位置可能没有足够的时间到达..

然后你设置mLocationRequest.setFastestInterval(30000);这基本上意味着30秒.所以至少30秒后,一般根据你的设置,首选时间是120秒,如果根本没有存储的最后已知位置,是不是很长时间?加上你正在设置电池平衡优先级,这将使你等待更长的时间.

mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
Run Code Online (Sandbox Code Playgroud)

我建议您先启动Google地图应用,以便至少有一些确认位置,然后测试您的应用.


小智 5

如果它返回 null,这意味着您需要在检索位置之前开始使用 LocationServices.FusedLocationApi.requestLocationUpdates 接收位置更新。

对我来说,解决问题的方法是调用:

LocationServices.FusedLocationApi.requestLocationUpdates(locationApiClient,locationRequest, this);

之前:

App.setLocation(LocationServices.FusedLocationApi.getLastLocation(locationApiClient));

问题是最后一个位置不存在所以它是空的。

如果问题仍然存在,请尝试以下操作:

检查必要的权限。

确保您已在设备上启用位置,然后重新启动。