Android getLastKnownLocation返回null
我读过一些关于这方面的问题,但我没有找到我需要的答案 所以,情况是,我已经设置好了我的地图,我想获取我当前的gps位置。 我已检查我的变量是否为空,但我的结果来自:Android getLastKnownLocation返回null,android,google-maps,location,Android,Google Maps,Location,我读过一些关于这方面的问题,但我没有找到我需要的答案 所以,情况是,我已经设置好了我的地图,我想获取我当前的gps位置。 我已检查我的变量是否为空,但我的结果来自: getLastKnownLocation(provider, false); 但是给我空值,所以这是我需要帮助的地方。 我添加了粗略+精细位置的权限。但我通常会禁用手机的各种网络数据,因为我对手机账单中不可预测的数据流费用不太满意。因此,我只为这次测试启用并连接了WiFi 为了实现这一点,我还需要启用其他功能吗?我认为WiFi应该
getLastKnownLocation(provider, false);
但是给我空值,所以这是我需要帮助的地方。
我添加了粗略+精细位置的权限。但我通常会禁用手机的各种网络数据,因为我对手机账单中不可预测的数据流费用不太满意。因此,我只为这次测试启用并连接了WiFi
为了实现这一点,我还需要启用其他功能吗?我认为WiFi应该足够了?您正在尝试从网络提供商处获取缓存位置。你必须等待几分钟,直到你得到一个有效的修复。由于网络提供商的缓存为空,因此您显然在那里得到了一个空值。使用此方法获取最后一个已知位置:
LocationManager mLocationManager;
Location myLocation = getLastKnownLocation();
private Location getLastKnownLocation() {
mLocationManager = (LocationManager)getApplicationContext().getSystemService(LOCATION_SERVICE);
List<String> providers = mLocationManager.getProviders(true);
Location bestLocation = null;
for (String provider : providers) {
Location l = mLocationManager.getLastKnownLocation(provider);
if (l == null) {
continue;
}
if (bestLocation == null || l.getAccuracy() < bestLocation.getAccuracy()) {
// Found best last known location: %s", l);
bestLocation = l;
}
}
return bestLocation;
}
LocationManager mLocationManager;
位置myLocation=getLastKnownLocation();
私有位置getLastKnownLocation(){
mlLocationManager=(LocationManager)getApplicationContext().getSystemService(位置服务);
List providers=mLocationManager.getProviders(true);
位置bestLocation=null;
for(字符串提供程序:提供程序){
位置l=mLocationManager.getLastKnownLocation(提供者);
if(l==null){
继续;
}
if(bestLocation==null | | l.getAccuracy()
添加此代码
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
在功能之前执行以下操作:
locationManagerObject.RequestLocationUpdate(LocationManager.GPS\u提供程序、更新之间的最短时间、更新的最短距离、新LocationListener())
以及函数:locationManagerObject.getLastKnownLocation(LocationManager.GPS\u提供程序)
将您的线路替换为
Location location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
当你不应该的时候,你正在混合新的和旧的位置API 要获得最后一个已知位置,您只需打电话
compile "com.google.android.gms:play-services-location:11.0.1"
mLocationClient.getLastLocation();
连接位置服务后
阅读如何使用新的位置API
private void getLastLocationNewMethod(){
FusedLocationProviderClient mFusedLocationClient=LocationServices.getFusedLocationProviderClient(此);
mFusedLocationClient.getLastLocation()文件
.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时的公共无效(位置){
//如果GPS关闭,GPS位置可能为空
如果(位置!=null){
获取地址(位置);
}
}
})
.addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
Log.d(“MapDemoActivity”,“尝试获取最后一个GPS位置时出错”);
e、 printStackTrace();
}
});
}
试试这个它对我很好:-
LocationManager mLocationManager;
Location myLocation = getLastKnownLocation();
private Location getLastKnownLocation() {
Location oldLoc;
while (true){
oldLoc = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (oldLoc == null){
continue;
}
else {
break;
}
}
return oldLoc;
}
您可以使用网络提供商代替GPS提供商以获得更快的结果。我在Xamarin.Android中遇到了这个问题
Location Location=locationManager.GetLastKnownLocation(provider);
返回空值。我检查了我的代码,知道我刚刚请求访问\u粗略\u位置的权限。我添加了代码以请求访问\u精细\u位置的权限,现在它没有返回空值。以下是我的代码:
void AskPermissions()
{
if (CheckSelfPermission(Manifest.Permission.AccessCoarseLocation) != (int)Permission.Granted ||
CheckSelfPermission(Manifest.Permission.AccessFineLocation) != (int)Permission.Granted)
RequestPermissions(new string[] { Manifest.Permission.AccessCoarseLocation, Manifest.Permission.AccessFineLocation }, 0);
else
GetLocation();
}
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
if (CheckSelfPermission(Manifest.Permission.AccessCoarseLocation) == (int)Permission.Granted &&
CheckSelfPermission(Manifest.Permission.AccessFineLocation) == (int)Permission.Granted)
GetLocation();
else
Log.Info(tag, "Permission not Granted: Please enter desired Location manually.");
}
void GetLocation()
{
locationManager = (LocationManager)GetSystemService(LocationService);
provider = locationManager.GetBestProvider(new Criteria(), false);
Location location = locationManager.GetLastKnownLocation(provider);
if (location != null)
Log.Info(tag, "Location Lat: " + location.Latitude + " Lon: " + location.Longitude);
else
Log.Info(tag, "Location is null");
}
如果任何来自Xamarin.Android(C#)的人都会发现它很有用。对于Java或Android Studio,代码将类似,只是有一些小的语法更改,如
GetLastKnownLocation()
将是GetLastKnownLocation()
在Java中,方法名以小写字母开头,而在C中,方法名以大写字母开头。我喜欢这个更新位置的解决方案:
LocationManager mLocationManager;
Location myLocation = getLastKnownLocation();
private Location getLastKnownLocation() {
mLocationManager = (LocationManager)getApplicationContext().getSystemService(LOCATION_SERVICE);
List<String> providers = mLocationManager.getProviders(true);
Location bestLocation = null;
for (String provider : providers) {
Location l = mLocationManager.getLastKnownLocation(provider);
if (l == null) {
continue;
}
if (bestLocation == null || l.getAccuracy() < bestLocation.getAccuracy()) {
// Found best last known location: %s", l);
bestLocation = l;
}
}
return bestLocation;
}
在resume中,添加以下条件:
Location myLocation = getLastKnownLocation();
if (myLocation == null) {
locationManager.requestLocationUpdates(
LocationManager.PASSIVE_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("GPS", "GPS Enabled");
}
也许是一些基本的,但检查GPS是否打开。好的,所以我需要建立缓存?当我的应用程序因此崩溃时,我该怎么做?你必须使用位置侦听器的onLocationChanged方法。获得有效的修复需要时间(几分钟)好的,谢谢。我会一直摆弄直到我看到它弹出一个日志=)即使它没有任何存储,我也需要移动它吗?结果我一直都是正确的,我只是注意到一个错误,我找到了一个解决方案。我的手机没有设置允许谷歌定位GPS。所以,是的。无论如何,谢谢=)很好的实现,非常灵活e、 谢谢!效果很好。谢谢!在手机中启用位置。问题是关于
getLastKnownLocation返回null
…如果对于所有提供商mLocationManager.getLastKnownLocation
,此代码将不会改变任何内容…因为它可以返回null)它仍将返回null…答案是…抱歉,您无法避免此问题…如果您确实希望该位置不使用GetLastKnownLocation您正在混合getLastLocation的新api和旧api,请遵循此答案。此答案值得一读:感谢您指出存在新api。这应该是公认的答案。非常感谢您使用此api速度快多了谢谢伙计我不知道它存在位置在这里也返回空值。原因是什么?检查位置许可同意…这应该是可以接受的答案。谢谢。