0

我试图通过 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);

结果,我不断得到一个空白字符串。

我之前问了一个关于没有收到城市的问题,但是现在似乎没有数据来了,如果是,它不是始终可用的。

4

1 回答 1

1

在您的代码中,您要求的是“最后一个已知位置”,而不是“当前位置”。其他一些应用程序之前要求提供位置,而您得到的结果与该应用程序相同。如果在启动您的应用程序之前没有请求位置,“最后已知位置”将为空。

正确的方法是注册监听器并等待位置更新到达。然后将结果存储为“最后已知位置”。

这个答案应该对您有所帮助:在 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);
于 2012-08-22T21:34:11.143 回答