Android FusedLocationClient.getLastLocation(),在成功时从未到达
我已经成功地使用FusedLocation获取设备之前最后一个已知的位置,但我不确定为什么它在这种情况下不起作用 我已经在物理设备和模拟设备上对其进行了测试 我实现了播放服务,并在清单中声明了所需的权限。 我还检查了我的应用程序的设备权限,启用了位置,并使用谷歌地图确保有最后一个已知位置 我声明Android FusedLocationClient.getLastLocation(),在成功时从未到达,android,Android,我已经成功地使用FusedLocation获取设备之前最后一个已知的位置,但我不确定为什么它在这种情况下不起作用 我已经在物理设备和模拟设备上对其进行了测试 我实现了播放服务,并在清单中声明了所需的权限。 我还检查了我的应用程序的设备权限,启用了位置,并使用谷歌地图确保有最后一个已知位置 我声明私有FusedLocationProviderClient fusedLocationClient在我的MainActivity类中 在主活动onCreate()中:FusedLocationClient
私有FusedLocationProviderClient fusedLocationClient代码>在我的MainActivity类中
在主活动onCreate()中:FusedLocationClient=LocationServices.getFusedLocationProviderClient(此)代码>
现在,我试图从用户从选项菜单中选择项目时检索最后一个已知位置
if(id == R.id.action_GPS){
fusedLocationClient.getLastLocation().addOnSuccessListener(this, new OnSuccessListener<Location>() {
@Override
public void onSuccess(Location location) {
if(location != null) {
Geocoder gcd = new Geocoder(context, Locale.getDefault());
try {
List<Address> adrs = gcd.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
} catch (IOException e) {
}
}
if(id==R.id.action\u GPS){
fusedLocationClient.getLastLocation().addOnSuccessListener(这是新的OnSuccessListener()){
@凌驾
成功时的公共无效(位置){
如果(位置!=null){
Geocoder gcd=新的Geocoder(上下文,Locale.getDefault());
试一试{
列表adrs=gcd.getFromLocation(location.getLatitude(),location.getLatitude(),1);
}捕获(IOE异常){
}
}
通过“fusedLocationClient.getLastLocation()…”进行调试后,它会跳到末尾,永远不会到达onSuccess方法。为什么会失败?在以下情况下,location对象可能为null:
- 设备设置中的位置已关闭。结果可能是
即使以前检索过最后一个位置,也为null,因为禁用位置也会清除缓存
- 设备从未记录其位置,可能是新设备或已恢复出厂设置的设备
- 设备上的Google Play服务已重新启动,并且没有活动的Fused Location Provider客户端在服务重新启动后请求了位置。要避免这种情况,您可以创建
新的客户端和请求位置会自行更新
当lastLocation==null时,您应该请求LocationUpdate。您可以使用
val client = LocationServices.getSettingsClient(this)
val task = client.checkLocationSettings(builder.build())
task.addOnSuccessListener {
//GPS is ON
}
task.addOnFailureListener {
if (it is ResolvableApiException) {
try {
//GPS is OFF
Toast.makeText(this, "Mohon aktifkan GPS anda",
Toast.LENGTH_LONG).show()
} catch (sendEx: IntentSender.SendIntentException) {
// Ignore the error.
}
}
}
别忘了检查用户的权限我会选择Cườ吴恩圭ễn的建议,并添加一些日志记录,即使位置为空。然后,您可能可以进一步调试该问题。事实上,当我自己从未请求位置更新时,我也遇到过类似的问题。这是否回答了您的问题?我最终只是发出位置请求。考虑到FusedLocation的不一致性,我真的不明白它的意义