我试图通过LocationManager.NETWORK_PROVIDER获取用户的位置,但它总是返回一个空字符串。有时我只能获得有效数据。有没有办法让这个方法重新迭代,直到它给我一个位置?我认为位置会很快到来,并且不需要这种方法。我已经尝试重新调用它,直到它没有显示空白字符串,但什么都没有出现。
这是我调用的方法
public String getLocation(Locale locale, Context context, boolean city, boolean postal, boolean state_prov) throws IOException{
LocationManager locMan = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE);
LocationListener locList = new MyLocList();
Geocoder gC = new Geocoder(context,locale);
Location gpsLocation = locMan.getLastKnownLocation(locMan.GPS_PROVIDER);
locMan.requestLocationUpdates(locMan.NETWORK_PROVIDER, 500, 200, locList);
Location networkLocation = locMan.getLastKnownLocation(locMan.NETWORK_PROVIDER);
if (city)
return (gC.getFromLocation(networkLocation.getLatitude(), networkLocation.getLongitude(), 1).get(0).getSubAdminArea());
else if (postal)
return (gC.getFromLocation(networkLocation.getLatitude(), networkLocation.getLongitude(), 1).get(0).getPostalCode());
else if (state_prov)
return (gC.getFromLocation(networkLocation.getLatitude(), networkLocation.getLongitude(), 1).get(0).getAdminArea());
else
return "Nothing";
}
我经常要求提供城市或邮政编码,但大部分时间它都是空的。使用
Location gpsLocation = locMan.getLastKnownLocation(locMan.GPS_PROVIDER);
导致NullPointer,所以我使用的是NETWORK_PROVIDER
我已设置这些权限:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
这就是我所说的
String data = getLocation(Locale.getDefault(),getBaseContext(),true,false,false);
我继续得到一个空字符串作为结果。
之前我问了一个关于没有收到这座城市的问题,但是现在看来似乎没有数据出现,如果是这样的话,它就不会一直可用。
答案 0 :(得分:1)
在您的代码中,您要求“最后的已知位置”,而不是“当前位置”。其他一些应用程序之前询问了位置,并且您获得的结果与该应用程序相同。如果在启动您的应用程序之前没有请求位置,“最后的已知位置”将为空。
正确的方法是注册监听器并等待位置更新到达。然后将结果存储为“最后已知位置”。
这个答案可以帮到你:What is the simplest and most robust way to get the user's current location in Android?
编辑:澄清一下,这里是上面链接中提到的MyLocation类的正确用法。您不能立即拥有该位置,而是将您的代码放在回调方法中,并在位置数据可用时调用它。
LocationResult locationResult = new LocationResult(){
@Override
public void gotLocation(Location location){
//Got the location!
//Here goes your code
//This method will be called when location data arrive
}
};
MyLocation myLocation = new MyLocation();
myLocation.getLocation(this, locationResult);