Google Play服务中的LocationRequest不会更新,间隔设置为小于1秒。

时间:2013-05-23 12:14:12

标签: java android gps location accelerometer

我正在开发一个Android应用程序,我需要在其中显示每秒30-40次更新的位置更新。 我正在使用Google I / O 2013中引入的Location APIs of Google Play Services。它使用融合位置提供商(利用加速计和其他传感器以及GPS)以获得更准确的信息。有效的位置跟踪。

这是我的代码:

protected void startLocationTracking() {
    if (GooglePlayServicesUtil.isGooglePlayServicesAvailable(this)) {
        mLocationClient = new LocationClient(this, mConnectionCallbacks, mConnectionFailedListener);
        mLocationClient.connect();
    }
}

private ConnectionCallbacks mConnectionCallbacks = new ConnectionCallbacks() {

    @Override
    public void onDisconnected() {
    }

    @Override
    public void onConnected(Bundle arg0) {
        LocationRequest locationRequest = LocationRequest.create();
        locationRequest.setFastestInterval(0);
        locationRequest.setInterval(0).setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        mLocationClient.requestLocationUpdates(locationRequest, mLocationListener);
    }
};

private OnConnectionFailedListener mConnectionFailedListener = new OnConnectionFailedListener() {

    @Override
    public void onConnectionFailed(ConnectionResult arg0) {
        Log.e(TAG, "ConnectionFailed");
    }
};

private LocationListener mLocationListener = new LocationListener() {

    private long mLastEventTime = 0;

    @Override
        public void onLocationChanged(Location location) {
            double delayBtnEvents = (System.nanoTime()- mLastEventTime )/(1000000000.0);
            mLastEventTime = System.nanoTime();

            //Sampling rate is the frequency at which updates are received
            String samplingRate = (new DecimalFormat("0.0000").format(1/delayBtnEvents));     

            float speed = (float) (location.getSpeed() * 3.6);  // Converting m/s to Km/hr
            tv.setText(speed + " kmph" + ", " + samplingRate + " Hz"); //Updating UI
    }
};

我已将优先级设置为PRIORITY_HIGH_ACCURACY和时间间隔&最快的间隔为0毫秒。但我仍然每1秒收到一次更新。

  

这几乎就像是GPS传感器的更新频率   任何Android手机。但我期待更多,因为这是使用Fusion   传感器(包括加速度计)。加速度计是其中的一部分   融合传感器应该产生比这更高的频率。

我已经尝试了间隔的其他值,但是间隔时间不到1秒就无法获得更新。此外,ACCESS_FINE_LOCATION用于清单中的权限。

我在这里遗漏了什么吗?他们是否有其他方法来实现这一目标?我将非常感谢任何帮助来解决这个问题。

4 个答案:

答案 0 :(得分:3)

目前,您无法以每秒一次的速度获得更新。这是硬件gps限制。网络位置稍慢(在室内使用) - 目前大约每5秒一次。原始加速度计数据以更高的频率进入,但直接集成时往往非常嘈杂。这可能会在将来有所改善,但可能不是您正在寻找的高频率。

答案 1 :(得分:1)

我正在尝试使用以下参数进行更改,并使用我设置的任何内容为其工作。

locationRequest.setFastestInterval(10000); // Every 10 sec it gives lat/lng

请尝试同样的改变。

答案 2 :(得分:0)

我认为问题在于您设置了PRIORITY_HIGH_ACCURACY。 High_accuracy = GPS提供商

手机中的Gps芯片组通常只有~1Hz的更新速率。

如果你禁用HighAccuracy,也许它可以工作。

答案 3 :(得分:-5)

事实是有一个你不能忽视的硬​​件延迟。尝试将浮动传递给您的间隔。每次更新后杀死僵尸也可能有所帮助。