首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么FusedLocationApi.getLastLocation为空

为什么FusedLocationApi.getLastLocation为空
EN

Stack Overflow用户
提问于 2015-04-22 11:41:34
回答 14查看 57.4K关注 0票数 44

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

代码语言:javascript
运行
复制
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

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

这是我的代码:

代码语言:javascript
运行
复制
 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);
}

在我的应用程序onCreate上:

代码语言:javascript
运行
复制
locationApiClient = getLocationApiClient();
locationApiClient.connect();

其中this是我的应用程序对象。为什么我要获得null (是的,我知道在文档中提到的一些罕见情况下它可能是空的,但我总是得到这个,而不是很少)之后仍然没有得到位置更新?这是一个真正的设备(三星银河S3),如果有帮助的话,它没有SIM卡。

EN

回答 14

Stack Overflow用户

发布于 2015-04-22 17:08:40

融合位置提供程序仅在至少一个客户端连接到它时才会维护后台位置。现在,仅仅打开location服务并不能保证存储最后一个已知的位置。

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

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

代码语言:javascript
运行
复制
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);

我建议你先启动地图应用程序,这样至少有一些确定的位置,然后测试你的应用程序。

票数 20
EN

Stack Overflow用户

发布于 2015-04-22 12:43:26

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

代码语言:javascript
运行
复制
  @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();
    }

这是我的工作代码。

希望我的密码能帮你。

干杯..。

票数 19
EN

Stack Overflow用户

发布于 2016-03-24 14:58:33

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

对我来说,解决这个问题的一个办法是叫:

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

在下列会议之前:

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

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

如果问题持续存在,请尝试如下:

检查必要的权限。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29796436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档