为什么FusedLocationApi.getLastLocation返回null

44

我正在尝试使用FusedLocationApi.getLastLocation获取位置,并在清单文件中获得了位置许可:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

然而,当我从系统请求位置时,我得到了null。我只是在测试开启和关闭位置服务,所以这可能与此有关(当然,在我尝试时它是打开的)。但即使返回null,我还在等待调用onLocationChanged,但从未被调用过。我在这里也看到了一个类似的问题:FusedLocationApi.getLastLocation always 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);
}

在我的应用程序的onCreate方法中:

locationApiClient = getLocationApiClient();
locationApiClient.connect();

为什么我得到了空值(是的,我知道在某些罕见情况下它可能为空,如文档中所述,但我总是得到这个空值,而不是很少)而且之后仍然没有得到位置更新? 这是一个真实的设备(三星Galaxy S3),没有SIM卡,如果可以帮助的话。


3
在Android中没有ACCESS_GPSACCESS_LOCATION权限。除此之外,如果没有代码,很难为您提供帮助。 - CommonsWare
@CommonsWare 我不知道我是怎么变成那样的,但无论如何,它不应该影响行为。 - Can Poyrazoğlu
你是在真实设备上测试吗?除了文档中说,如果客户端未连接,则返回null。确保您的客户端始终处于连接状态。 - Amit K. Saha
你能否粘贴一下初始化 API 客户端和获取 null 的代码? - Borja Alvarez
1
那个回答和这篇文章中到处都是的废话完全一样。问题不在于位置回调,而在于FusedLocationProvider返回getLastLocation时返回null。我亲眼看到它先是报告null,然后正确地报告,几秒钟后又再次报告null,但只有某些设备会出现这种情况。 - Saik Caskey
显示剩余7条评论
14个回答

0

试试这个,

    private static int UPDATE_INTERVAL = 10000; // 10 sec
    private static int FATEST_INTERVAL = 5000; // 5 sec
    private static int DISPLACEMENT = 10; // 10 meters


   private void createLocationRequest() {
    mLocationRequest = new LocationRequest();
    mLocationRequest.setInterval(UPDATE_INTERVAL);
    mLocationRequest.setFastestInterval(FATEST_INTERVAL);
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    mLocationRequest.setSmallestDisplacement(DISPLACEMENT);
  }

 @Override
    public void onConnected(@Nullable Bundle bundle) {
        mLastLocation = LocationServices.FusedLocationApi
            .getLastLocation(mGoogleApiClient);
       if(mLastLocation == null){
           LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
        }
    }

1
那远远不能解释为什么它为空。 - Saik Caskey

0

我曾经遇到过同样的问题。在我的情况下,问题出在允许应用程序权限上。 当应用程序第一次启动时,我拒绝了要求的精确位置权限。

尝试从设备中卸载该应用程序,然后重新部署它。它将再次请求权限。允许访问精确位置。

在我的情况下有效!!


卸载是不必要的。权限可以在应用程序执行期间进行修改。 - kaiya

-1

30分钟前遇到了类似的问题,在新模拟器之前代码是可以运行的。 更改模拟器的经纬度后,它又开始工作了。


这并没有回答“为什么是...?”的问题。 - kaiya

-1
我刚做了一个发现,也许可以帮到你们中的一些人。我从getLastLocation()获取了null,结果是因为我尝试只打开GPS来获取位置,但显然也必须打开Wi-Fi(即使没有连接到任何网络)。 我在想这是否是我的设备故障(三星平板电脑)... 我正在深入研究这个问题,但目前还没有发现什么。我会欣赏任何人分享有关此问题的更多知识。

答案只包含猜测,没有解释,即使之前的帖子已经指出了问题。 - kaiya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接