java - 位置并不总是出现

标签 java android geolocation

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

结果我一直得到一个空字符串。

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

最佳答案

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

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

这个答案应该对您有帮助: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);

关于java - 位置并不总是出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12077377/

相关文章:

java - 查询在本地后端工作但不在部署的后端上工作

java - 如何将静态导入添加到 IntelliJ IDEA 实时模板

Java - 扫描器 : reading line of record separated by Pipe | as delimiter

java - 动态添加 View 并调整父 ViewGroup 的大小

android - 使用 com.flyingsoftgames.xapkreader 插件扩展 Phonegap APK

mysql - MySQL 中的空间索引 - 错误 - 无法从发送到 GEOMETRY 字段的数据中获取几何对象

android - 相机无法在 HTC 设备上打开

android - 如何让EditText只能读取和复制但不能编辑

javascript - Phonegap 地理定位不适用于移动设备

api - 获得 2 个字母的州/省缩写