【问题标题】:Android Location Services Not Updating requestLocationUpdatesAndroid 定位服务未更新 requestLocationUpdates
【发布时间】:2013-10-16 03:38:48
【问题描述】:

我有一个简单的类 GPSListener 获取 GPS 坐标:

public class GPSListener implements LocationListener {  

public static double latitude;  
public static double longitude;  

@Override  
public void onLocationChanged(Location loc)  
{  
    loc.getLatitude();  
    loc.getLongitude();  
    latitude = loc.getLatitude();  
    longitude = loc.getLongitude(); 
    Log.d("GPSLISTENER ", "lat: "+latitude+"  long:"+longitude);
} ...

然后尝试在我的活动中使用这个类,我只需在我的活动中的onCreate() 函数中调用该类:

LocationManager mlocManager =   (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    LocationListener mlocListener = new GPSListener();

    Criteria criteria = new Criteria();
    String bestProvider = mlocManager.getBestProvider(criteria, false);
    mlocManager.requestLocationUpdates(bestProvider, 0, 0, mlocListener);

    mlocManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 0, 0, mlocListener);

    if (mlocManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {  
            lat = GPSListener.latitude;
            lon = GPSListener.longitude;
            Log.d("GPS", "lat: "+lat+"  long:"+lon);
    } else {  
           // TODO: GPS not enabled
            Log.d("GPSERROR", "GPS not enabled");
    }

但是每当我运行应用程序时,我的活动中的latlon 总是为零。我不太确定如何解决这个问题。

记录时:

Log.d("GPSLISTENER ", "lat: "+latitude+"  long:"+longitude);

它返回正确的纬度和经度,活动开始后只需一两秒。

Log.d("GPSSUCCESS", "lat: "+lat+"  long:"+lon);

两者都返回 0.0。我的印象是.requestLocationUpdates 会在执行 if 语句之前将值传递给latlon。我怎样才能做到这一点?

【问题讨论】:

  • 您是否在清单文件中添加了位置权限(android.permission.ACCESS_FINE_LOCATION)?
  • 如果您在模拟器上进行测试,您需要将坐标传递给它,或者如果您在您的设备上,请重新启动设备并检查。
  • @Shrikant 我正在我的设备上进行测试。正如我所说,它能够在 GPSListener 中获取 GPS 坐标,所以我认为这不是通信错误。我认为这更有可能是语法错误。

标签: android gps location


【解决方案1】:

您正在使用公共静态字段作为纬度、经度。

请将其更改为非静态并使用 setter、getter 和即时对象:

lat = mlocListener.getLatitude();
lon = mlocListener.getLongitude();

【讨论】:

  • 可以替换:mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mlocListener); by: 位置 loc = mlocManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
【解决方案2】:

Google 更新了其位置处理逻辑。现在使用融合位置提供程序更容易收听位置更新。您可以在 5 分钟内实现您的位置侦听器。看一看。 Methods for getting the most accurate location

您正在仅收听 gps 提供程序,它还没有准备好(等待位置状态),然后它不会返回任何位置。只需查看 fused location provider 并再次编写您的位置侦听器即可。

【讨论】:

    【解决方案3】:

    试试这个...

    mGoogleMap.setOnMyLocationButtonClickListener(new OnMyLocationButtonClickListener() {
    
                @Override
                public boolean onMyLocationButtonClick()
                    {
                        try
                            {
                                Location myLocation = mGoogleMap.getMyLocation();
                                onLocationChanged(myLocation);
    
                            }
                        catch (Exception e)
                            {
                                Log.getStackTraceString(e);
                            }
    
                        return false;
                    }
            });
    

    使用这个处理程序来获取位置

        private Handler customHandler = new Handler();
    
    
       private Runnable updateTimerThread = new Runnable() {
    
        @Override
        public void run()
            {
                try
                    {
    
                        Location myLocation = mGoogleMap.getMyLocation();
                        secndLocationListener.onLocationChanged(myLocation);
                    }
                catch (Exception e)
                    {
                        Log.getStackTraceString(e);
                    }
    
            }
    };
    

    运行这个

       customHandler.postDelayed(updateTimerThread , 1000);
    

    【讨论】:

      【解决方案4】:

      LocationManager 使用缓存中的最后一个已知位置。加载谷歌地图时缓存会更新。试试这个,出去看看你的位置。移动到大约 200m 的不同位置并再次检查您的位置。它将与旧的相同。现在,加载谷歌地图,你会发现你的应用程序神奇地有了新的位置。

      您需要以编程方式将该缓存踢到最新位置。这样做的唯一方法是

      YOUR_APPLICATION_CONTEXT.getLocationManager().requestLocationUpdates(
      LocationManager.NETWORK_PROVIDER, 0, 0, new LocationListener() {
          @Override
          public void onStatusChanged(String provider, int status, Bundle extras) {
          }
          @Override
          public void onProviderEnabled(String provider) {
          }
          @Override
          public void onProviderDisabled(String provider) {
          }
          @Override
          public void onLocationChanged(final Location location) {
          }
      });
      

      【讨论】:

        猜你喜欢
        • 2014-04-03
        • 1970-01-01
        • 1970-01-01
        • 2011-10-03
        • 1970-01-01
        • 2017-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多