首页 > 解决方案 > HERE SDK TrafficUpdater.request(Geocordinate, TrafficUpdater.Listener) 不返回流量结果

问题描述

我一直在努力将几个 HERE 功能集成到我正在开发的应用程序中。现在我正在尝试将流量数据添加到应用程序中。默认的自动更新对我来说不够频繁(约 1 分钟),所以我尝试使用 TrafficUpdater.request(GeoCoordinate, TrafficUpdater.Listener) 每 5 秒左右手动检索一次交通信息。问题是,尽管请求行执行,但从未调用过侦听器,并且我从未收到任何流量更新。以下是我的活动:

import android.os.CountDownTimer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import com.here.android.mpa.common.GeoCoordinate;
import com.here.android.mpa.common.GeoPosition;
import com.here.android.mpa.common.MapSettings;
import com.here.android.mpa.common.OnEngineInitListener;
import com.here.android.mpa.common.PositioningManager;
import com.here.android.mpa.guidance.TrafficUpdater;
import com.here.android.mpa.mapping.Map;
import com.here.android.mpa.mapping.MapFragment;
import com.here.android.mpa.mapping.MapTrafficLayer;
import com.here.android.mpa.mapping.MapView;
import com.here.android.mpa.mapping.TrafficEvent;

import java.io.File;
import java.lang.ref.WeakReference;

public class MainActivity extends AppCompatActivity {

    private Map map;
    private MapFragment mapFragment;
    private TrafficUpdater trafficUpdater;

    private PositioningManager.OnPositionChangedListener onPositionChangedListener = new PositioningManager.OnPositionChangedListener() {
        @Override
        public void onPositionUpdated(PositioningManager.LocationMethod locationMethod, GeoPosition geoPosition, boolean b) {
            onLocationUpdate(geoPosition);
        }

        @Override
        public void onPositionFixChanged(PositioningManager.LocationMethod locationMethod, PositioningManager.LocationStatus locationStatus) {

        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MapSettings.setIsolatedDiskCacheRootPath(
                getApplicationContext().getExternalFilesDir(null) + File.separator + ".here-maps",
                "MAP_SERVICE");
        mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.map);
        mapFragment.init(new OnEngineInitListener() {
            @Override
            public void onEngineInitializationCompleted(Error error) {
                if (error == Error.NONE) {
                    map = mapFragment.getMap();
                    initTracker();
                }
            }
        });

    }
        private void initTracker() {
        trafficUpdater = TrafficUpdater.getInstance();
        trafficUpdater.enableUpdate(false);
        PositioningManager positioningManager = PositioningManager.getInstance();
        positioningManager.addListener(new WeakReference<PositioningManager.OnPositionChangedListener>(onPositionChangedListener));
        mapFragment.getPositionIndicator().setVisible(true);
        positioningManager.start(PositioningManager.LocationMethod.GPS_NETWORK);

    }

    private boolean isTimerRunning = false;
    CountDownTimer trafficTimer = new CountDownTimer(5000,5000) {
        @Override
        public void onTick(long millisUntilFinished) {

        }

        @Override
        public void onFinish() {
            isTimerRunning = false;
            getTrafficInfo();
        }
    };

    private GeoPosition lastGeoPosition;

    private void onLocationUpdate(GeoPosition geoPosition) {
        map.setCenter(geoPosition.getCoordinate(), Map.Animation.NONE);
        Log.i("____MAINACTIVITY", "location update");
        lastGeoPosition = geoPosition;
        if(!isTimerRunning) {
            trafficTimer.cancel();
            trafficTimer.start();
            isTimerRunning = true;
        }

    }

    private TrafficUpdater.Listener trafficListener = new TrafficUpdater.Listener() {
        @Override
        public void onStatusChanged(TrafficUpdater.RequestState requestState) {
            Log.i("____MAINACTIVITY", requestState.name());
        }
    };

    private void getTrafficInfo() {
        if(lastGeoPosition != null) {
            TrafficUpdater.RequestInfo requestInfo = trafficUpdater.request(lastGeoPosition.getCoordinate(), trafficListener);
            Log.i("___MAINACTIVITY", requestInfo.getError().name());
        }
    }
}

我已经尝试了几件事来解决这个问题。首先,我在开发者门户上检查了我所有的应用程序权限和项目仪表板,以确保一切设置正确,并且确实如此。我在执行请求的行中将侦听器作为匿名方法提供,但这不起作用。我将侦听器移动为活动的私有成员变量,并以这种方式提供,但它仍然无法正常工作。我检查了该方法返回的RequestInfo,它总是指示一个错误代码NONE,所以看起来好像没有发生错误。最后,我将更新频率设置为每 1.5 秒一次(远高于默认值),但我仍然没有收到任何信息。有谁知道这个问题的解决方案?我觉得好像我错过了一些简单的事情。

标签: here-api

解决方案


流量源确实只在一分钟的时间范围内提供更新。强制应用程序以更高的频率请求此请求不会提供更新的数据。我建议保留默认的自动更新。


推荐阅读