我正在研究教材《Android. Programming for Professionals》(2017年第3版),有这么一个地方:
LocationRequest request = LocationRequest.create();
request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
request.setNumUpdates(1);
request.setInterval(0);
LocationServices.FusedLocationApi
.requestLocationUpdates(mClient, request, new LocationListener() {
@Override
public void onLocationChanged(Location location) {
Log.i(TAG, "Got a fix: " + location);
}
});
问题是启动后,Location
日志中没有消息。也就是说,onLocationChanged
程序根本没有落下。
在文档中,我发现此选项用于获取Location
:
LocationServices.getFusedLocationProviderClient(getContext())
.getLastLocation()
.addOnSuccessListener(getActivity(), new OnSuccessListener<Location>() {
@Override
public void onSuccess(Location location) {
Log.i(TAG, "Got a fix: " + location);
}
});
但他回来了null
。
有什么问题?或者有其他方法可以得到Location
吗?
FusedLocationProvider
如果至少有一个客户端连接到它,目前将仅支持后台地理位置检索。一旦第一个客户端连接,它将立即尝试查找位置。如果您Activity
是第一个连接的客户端并且您立即调用getLastLocation()
,onConnected()
则可能没有足够的时间登录以获取第一个位置数据。getLastLocation()
适用于需要立即使用或根本无法使用该位置的情况。如果你真的想等待地理位置数据,最好使用requestLocationUpdates()
并等待回调。如果您只需要一个位置请求,您可以在 中指定LocationRequest
,一旦您的更新可用,该请求将被自动删除。LocationServices.FusedLocationApi
- 如果您查看代码,您将看到:那些。也不建议使用它。
如果您查看请求位置更新文档,有一个获取地理位置的示例:
地理位置获取回调定义: