android - 每次询问时如何确保获得gps位置
问题描述
在我的应用中,人们发布其他人可以看到的广告。他们使用公告的创建者和阅读它的人之间的距离进行过滤。如果有人发布广告,我需要确保获得他的位置。如果有人在寻找广告,我需要确保获得他的位置以对广告进行分类。
在我的代码中,我有一种获取位置的方法,但它有时会返回 null。
这是小代码(我已经检查了权限等)
FusedLocationProviderClient mFusedLocationProviderClient;
mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(context);
try{
if(mLocationPermissionsGranted){
final Task location = mFusedLocationProviderClient.getLastLocation();
location.addOnCompleteListener(new OnCompleteListener() {
@Override
public void onComplete(@NonNull Task task) {
if(task.isSuccessful()){
Log.d(TAG, "onComplete: found location!");
Location currentLocation = (Location) task.getResult();
if (currentLocation != null)
{
double Latit = currentLocation.getLatitude();
double Longit = currentLocation.getLongitude();
LatLng latLong = new LatLng(Latit, Longit);
//TODO do something with latlong
}
}else{
Log.d(TAG, "onComplete: current location is null");
Toast.makeText(context, "unable to get current location", Toast.LENGTH_SHORT).show();
}
}
});
}
}catch (SecurityException e){
Log.e(TAG, "getDeviceLocation: SecurityException: " + e.getMessage() );
}
但有时,Location currentLocation = (Location) task.getResult();
即使任务成功,也会返回 null。我真的不知道为什么。我想知道是否有一种可靠的方法可以在我询问时获取位置(当然,它的位置是在手机上启用的)。谢谢
解决方案
那是因为您只要求获取最后一个位置。如果最近有其他应用程序一直在使用 gps,则设备可以拥有它,但有时需要一段时间才能获得位置。
您应该订阅位置更改并至少等到您获得第一个位置。一种方法可能是仅在您收到最后一个位置为空时订阅。在这种情况下,您应该执行requestLocationUpdates
一个请求权限的回调,以防您需要该位置,如果应用程序在后台,并且如果您只需要一个位置,您可以在第一个位置到达后停止它removeLocationUpdates
。
查看文档。或者你可以使用像rxlocation这样的库,以防你觉得 observables 比回调更舒服。
推荐阅读
- android - 如何从 SQLite 数据库 Android Studio 中获取所有表
- ruby-on-rails - 如何在 RSpec (rails) 中创建或指定关联?
- mysql - 全文搜索在 mysql 中没有按预期工作?
- php - Laravel 8 返回视图空白页或白屏
- airflow - 气流测试命令意外更新元数据数据库
- c# - 尚未指定报告的报告定义
- css - Bootstrap React Nextjs,看起来与文档上的不一样
- spreadsheet - 将 Google 电子表格链接到 Google 调查表的问题
- c# - Is there .cs file equivalent for .razor file's @inject HttpClient Http
- python - 在 yml 文件中附加值的 Python 代码