为啥 getLastLocation() 方法在第一次启动应用程序时不检索位置?

Posted

技术标签:

【中文标题】为啥 getLastLocation() 方法在第一次启动应用程序时不检索位置?【英文标题】:Why getLastLocation() method not retrieving the location the very first time app is launched?为什么 getLastLocation() 方法在第一次启动应用程序时不检索位置? 【发布时间】:2016-11-16 10:35:49 【问题描述】:

我正在开发一个安卓应用,我想在应用启动后立即检索用户的当前位置。

我正在使用此代码:

@Override
    public void onConnected(@Nullable Bundle bundle) 
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) 
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;
        
        mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
                mGoogleApiClient);
        if (mLastLocation != null) 
            currentLatDouble = mLastLocation.getLatitude();
            currentLngDouble = mLastLocation.getLongitude();
        
    

我正在使用Snackbar,当未检测到位置并有一个“重试”按钮时会弹出。按下那个“RETRY”按钮后,上面的代码会再次执行,这次会检索到位置。

我想要的是,我想在应用启动后立即检索位置。

请告诉我。

【问题讨论】:

像往常一样回答...因为 getLastLocation 可能返回 null... @Selvin 为什么每次启动应用程序都返回 null 而不是第二次尝试? 这可能是设备获取某个位置并设置为最后一个已知位置的时间。 @DiegoMalone 如何在应用启动时避免这种行为并检索位置? @HammadNasir 我已经回答了问题,请看答案。 【参考方案1】:

如果还没有最后一个已知位置,LocationServices.FusedLocationApi.getLastLocation 方法可能会返回 null

最好的用途是请求位置更新并在onLocationChanged 回调中处理响应,如下所示:

@Override
public void onConnected(Bundle connectionHint) 
    ...
    if (mRequestingLocationUpdates) 
        startLocationUpdates();
    


protected void startLocationUpdates() 
    LocationServices.FusedLocationApi.requestLocationUpdates(
            mGoogleApiClient, mLocationRequest, this);

LocationListener 将处理接收到的位置

public class MainActivity extends ActionBarActivity implements LocationListener 
...
@Override
public void onLocationChanged(Location location) 
    mCurrentLocation = location;

请务必查看documentations。这个answer也可以帮到你。

【讨论】:

我不知道为什么,但是在应用启动时没有检索到位置,并且在第二次尝试时检索到! 这是因为当应用程序启动时,对最后一个位置的请求是在它获得位置修复之前。在随后的尝试中,它有足够的时间进行修复。如果你把重试动作放在初始化之后,也许在第二次调用中,它仍然没有位置。最好的方法是请求一个位置,一旦设备获得一个位置,您就假定它是第一个已知位置。

以上是关于为啥 getLastLocation() 方法在第一次启动应用程序时不检索位置?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 fusedLocationProviderClient.getLastLocation 从不调用 OnSuccessListener?

将活动上下文传递给片段内的getLastLocation的更好方法

无法让 getLastLocation 方法在 Android Studio 中工作

FusedLocationApi.getLastLocation 始终为空

getLastLocation() 是不是请求当前位置?

GoogleApiClient 中的 getLastLocation() 始终为空