被动地监听GPS位置更新

4
我想要做的是:一个服务,持续监听 GPS(是的:仅限 GPS)位置更新,而不主动请求它们 - 也就是说,这个应用程序在其他应用程序请求/接收 GPS 位置更新之前不会消耗任何额外的电池寿命或 CPU 时间。然后我的应用程序应该执行一些功能。之后,它应该回到“睡眠”状态,等待下一个 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 的 Google 地图并在那里获取定位时,位置监听器没有“通知”(即没有记录任何内容)。
该如何正确实现?

1
可能是Google地图没有更新被动提供程序。类似(重复?)问题在这里:http://stackoverflow.com/q/9620107/324625。 - Steve Blackwell
@xenonite 你解决了这个问题吗?我正在做类似的东西。 - uofc
3个回答

1

我想知道它不工作是因为没有接收到被动位置,还是代码本身有问题。所以我首先要做的是开始监听网络和GPS位置(进行测试),并确保它们能够到达。如果它们能够到达,那么这表明Google Maps正在使用缓存位置,并且没有启动被动位置广播。

如果您没有获得任何位置,请检查您的代码并使其与GPS/网络配合工作,然后再转向被动位置。


1

嘿,我认为你需要更新经纬度数值。

请点击此链接 这里

我已经在安卓手机上尝试并测试过了,它可以正常工作。

注意: 必须在开启GPS状态的安卓手机上进行测试。 它不会在Eclipse模拟器中显示,但是在手机上会显示,请尝试一下。

祝你愉快。


这并没有回答提问者的问题。他想要在应用关闭时被动地收集数据。只有在应用开启时才能实现。 - Samuel Thompson

0

使用Google(或Lost){{link2:LocationRequest}}如何?(代码扩展自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,这将以零附加电量消耗的方式提供最佳准确度。
除非其他客户端已请求位置更新,否则不会返回任何位置信息,在这种情况下,此请求将作为被动侦听器传递位置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接