【问题标题】:Listen *passively* to gps location updates*被动*收听gps位置更新
【发布时间】:2012-03-29 14:40:38
【问题描述】:

我想要做的是以下内容:一个服务,它会持续监听 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 的谷歌地图并在那里获得定位,位置侦听器未“通知”(即不记录任何内容)

如何正确地做到这一点?

【问题讨论】:

  • 可能是谷歌地图没有更新被动提供者。类似(重复?)问题:stackoverflow.com/q/9620107/324625
  • @xenonite 你有没有弄清楚这个问题?我正在做类似的事情

标签: android gps


【解决方案1】:

我想知道它是否不起作用,因为没有收到被动位置,或者代码不起作用。所以我要做的第一件事就是开始监听网络和 GPS 位置(用于测试)并确保它们到达。如果是这样,则表明 Google 地图正在使用缓存位置,而不是在发起被动位置广播。

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

【讨论】:

    【解决方案2】:

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

    点击此链接..Click here

    我已经尝试过了,并在安卓手机上测试过。它的工作原理。

    注意: 必须并且应该在具有 GPS 状态的 android 手机中进行测试。 它不会在eclipse模拟器上显示。但是会显示在手机上试试看..

    玩得开心。

    【讨论】:

    • 这没有回答 OP 的问题。他想在应用程序关闭时被动地收集数据。仅在应用打开时有效
    【解决方案3】:

    如何使用谷歌(或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,这给出了

    在零额外功耗的情况下实现最佳精度。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      • 1970-01-01
      • 2013-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-18
      相关资源
      最近更新 更多