*被动地*听gps位置更新

时间:2012-03-29 14:40:38

标签: android gps

我想要做的是:服务,持续监听gps(是的: JUST gps)位置更新,而不主动请求它们 - 即这个应用程序不应该消耗额外的资源电池寿命或CPU时间,直到其他应用程序请求/接收GPS位置更新。那么我的应用程序应该执行一些功能。在此之后,它应该回到“睡眠”,等待下一个gps位置修复被其他应用程序请求...

我已经阅读了这篇文章http://android-developers.blogspot.de/2011/06/deep-dive-into-location.html,但这似乎有不同的侧重点。实际上,我在这里有点迷失......如何使用这个被动位置提供商呢?我无法让它发挥作用。

到目前为止我的代码:我有这个(远程)服务注册位置监听器:

public class MyService extends Service
{
    LocationManager locationManager;

    @Override
    public IBinder onBind(Intent intent)
    {
        return serviceBinder;
    }

    private final IMyService.Stub serviceBinder = new IMyService.Stub()
    {};

    @Override
    public void onCreate()
    {
        super.onCreate();

        Log.d(Config.LOGTAG, "service started");

        locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
        locationManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 0, 0, new GPSLocationListener());
    }

    @Override
    public void onDestroy()
    {
        super.onDestroy();

        Log.d(Config.LOGTAG, "service destroyed");
    }

    public class GPSLocationListener implements LocationListener
    {
        @Override
        public void onLocationChanged(Location location)
        {
            Toast.makeText(getBaseContext(), "GPS FIX RECEIVED: " + location.getLongitude() + " : " + location.getLatitude(), Toast.LENGTH_LONG).show();
            Log.d(Config.LOGTAG, "GPS FIX RECEIVED: " + location.getLongitude() + " : " + location.getLatitude());
        }

        @Override
        public void onProviderDisabled(String arg0)
        {
            Log.d(Config.LOGTAG, ":(");
        }

        @Override
        public void onProviderEnabled(String arg0)
        {
            Log.d(Config.LOGTAG, ":)");
        }

        @Override
        public void onStatusChanged(String arg0, int arg1, Bundle arg2)
        {
            Log.d(Config.LOGTAG, ":/");
        }
    }
}

不幸的是,这根本不起作用: 该服务根据日志启动,但是当我例如打开谷歌地图并启用gps并在那里获得定位,位置监听器不会“通知”(即不记录任何内容)

如何做到这一点?

3 个答案:

答案 0 :(得分:1)

我想知道它是否无法正常工作,因为没有收到被动位置,或者代码无效。所以我要做的第一件事就是开始收听网络和GPS位置(进行测试)并确保它们到达。如果他们这样做,那么这表明谷歌地图正在使用缓存的位置,并没有发起被动的位置广播。

如果您没有获得任何位置,则需要检查您的代码并使其与GPS /网络一起使用,然后再转移到被动位置。

答案 1 :(得分:1)

嘿,我认为您需要更新经度和纬度值。

点击此链接.. Click here

我已经尝试过并在Android手机上进行测试..它正在工作。

注意:  必须和应该在Android手机上测试GPS状态。 它不会在eclipse模拟器上显示。但它会在手机上展示尝试..

很开心。

答案 2 :(得分:0)

如何使用Google(或LostLocationRequest(代码从https://github.com/lostzen/lost/blob/master/docs/location-updates.md扩展)

LocationRequest request = LocationRequest.create()
    .setPriority(LocationRequest.PRIORITY_NO_POWER)
    .setInterval(5000)
    .setSmallestDisplacement(10);

LocationListener listener = new LocationListener() {
  @Override
  public void onLocationChanged(Location location) {
    if (location.getProvider().equals("gps")) {
      // Do stuff
    }
  }
};

截至https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest.html#PRIORITY_NO_POWER,这给出了

  

最佳精度,零功耗。

     

除非其他客户端请求位置更新,否则不会返回任何位置,在这种情况下,此请求将充当这些位置的被动侦听器。