我已经读过一些关于此的问题,但我找不到我需要的答案。
所以,案例是我设置了地图,我想获取当前的gps位置。 我检查过我的变量不是NULL但是我的结果来自:
getLastKnownLocation(provider, false);
虽然给我空,所以这是我需要帮助的地方。 我已经为COARSE + FINE位置添加了权限。但我通常会为手机禁用各种网络数据,因为我对手机账单中不可预测的数据流费用感到不满。所以我只启用了WiFi并连接了这个测试。
为了实现这一目标,还有什么我需要启用的功能吗?我认为WiFi应该足够了吗?
答案 0 :(得分:166)
使用此方法获取最后的已知位置:
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;
}
答案 1 :(得分:22)
当你不应该将新的和旧的位置API混合在一起时。
要获取最后一个已知位置,您只需致电
compile "com.google.android.gms:play-services-location:11.0.1"
mLocationClient.getLastLocation();
连接位置服务后。
阅读如何使用新的位置API
http://developer.android.com/training/location/retrieve-current.html#GetLocation
private void getLastLocationNewMethod(){
FusedLocationProviderClient mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
mFusedLocationClient.getLastLocation()
.addOnSuccessListener(new OnSuccessListener<Location>() {
@Override
public void onSuccess(Location location) {
// GPS location can be null if GPS is switched off
if (location != null) {
getAddress(location);
}
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.d("MapDemoActivity", "Error trying to get last GPS location");
e.printStackTrace();
}
});
}
答案 2 :(得分:5)
您正尝试从网络提供商处获取缓存位置。您需要等待几分钟才能获得有效的修复。由于网络提供程序的缓存为空,因此显然在那里得到空值。
答案 3 :(得分:1)
尝试一下对我有用:-
LocationManager mLocationManager;
Location myLocation= getLastKnownLocation();
private Location getLastKnownLocation() {
Location oldloc;
while (true){
oldloc=locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (oldloc==null){
continue;
}
else {
break;
}
}
return oldloc;
}
您可以使用NETWORK_PROVIDER代替GPS_PROVIDER以获得更快的结果。
答案 4 :(得分:0)
添加此代码
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.requestLocationUpdates(LocationManager.GPS_PROVIDER, MINIMUM_TIME_BETWEEN_UPDATES, MINIMUM_DISTANCE_CHANGE_FOR_UPDATES, new LocationListener())
以及功能:locationManagerObject.getLastKnownLocation(LocationManager.GPS_PROVIDER)
答案 5 :(得分:0)
我在Xamarin.Android中遇到了这个问题。
Location location = locationManager.GetLastKnownLocation(provider);
返回空值。我检查了代码,得知我刚刚请求了对ACCESS_COARSE_LOCATION的许可。我添加了代码以请求对ACCESS_FINE_LOCATION的许可,现在它没有返回null。这是我的代码:
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#中的方法名称以大写字母开头。
答案 6 :(得分:0)
我喜欢此解决方案来更新位置:
在简历中,添加条件:
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是否已打开。
答案 7 :(得分:-4)
用
替换你的行Location location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);