【问题标题】:Update location every 30 seconds using Network Location Provider?使用网络位置提供程序每 30 秒更新一次位置?
【发布时间】:2013-06-21 01:22:58
【问题描述】:

每多少秒调用一次 onLocationChanged? 我想每 30 秒更新一次用户的位置,但我不知道该怎么做。

P.S:我使用的是网络位置提供程序,而不是 GPS。我知道 GPS 更准确,但我关心电池消耗和室内位置。

这是我的方法,它每隔一定的时间间隔调用一次(我不知道具体多少)..

TextView tvLong,tvLati;
    Button btnGet;
    private LocationManager locationManager;
    private String provider;
    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    tvLong =(TextView)findViewById(R.id.tvLong);
    tvLati = (TextView)findViewById(R.id.tvLati);
    btnGet = (Button)findViewById(R.id.btnGet);
    btnGet.setOnClickListener(this);

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        Criteria criteria = new Criteria();
        provider = locationManager.getBestProvider(criteria, false);
        Location location = locationManager.getLastKnownLocation(provider);

        // Initialize the location fields
        if (location != null) {
        System.out.println("Provider " + provider + " has been selected.");
            onLocationChanged(location);
        } else {
            tvLati.setText("Location not available");
            tvLong.setText("Location not available");
        }

        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 0, this); // I dont know what this exactly DOES.

}
public void onLocationChanged(Location location) {

    lat =  (location.getLatitude());
    lng = (location.getLongitude());
    String valueLati = "Latitude: " + lat;
    String valueLong = "Longitude: " + lng;

    tvLati.setText(valueLati);
    tvLong.setText(valueLong);

}   

【问题讨论】:

    标签: android


    【解决方案1】:

    选项 1

    如果您需要调用onLocationChanged,请不要使用requestLocationUpdates,因为该API 在自定义Android 手机(三星)上完全不可靠。最好使用 AlarmManager 并调用 getLastKnownLocation,然后自己调用 onLocationChanged

    另请注意,三星手机上的 getLastKnowLocation 存在问题,因此您需要触发 api 来更新幕后的 API,然后才能期望它返回一个好的位置。

    在 getLastKnownLocation 之前调用它,这是一个 hack。

    注意:这对您的应用没有任何作用,只会触发后端缓存以获得良好的最后已知位置

    HomeScreen.getLocationManager().requestLocationUpdates(
        LocationManager.NETWORK_PROVIDER, 0, 0, new LocationListener() {
            @Override
            public void onStatusChanged(String provider, int status, Bundle extras) {
            }
            @Override
            public void onProviderEnabled(String provider) {
            }
            @Override
            public void onProviderDisabled(String provider) {
            }
            @Override
            public void onLocationChanged(final Location location) {
            }
        });
    

    选项 2

    垃圾所有,并使用新的LocationClient API。这也有一个 getLastLocation 有点 API,您可以与 AlarmManager 一起使用。使用 LocationClient,您无需担心最佳供应商、可用供应商、准确性选择和传感器。 LocationClient 将它们全部合并为 1 个不错的 API。

    报警管理器

    经过一番痛苦,我让它工作了。所以这里,link

    【讨论】:

    • 嗨 Siddharth,这里的 HomeScreen 是什么意思?我尝试使用位置管理器对象,它返回我仍然是 NULL
    • HomeScreen 是您的家庭活动,或您调用它的任何活动。或者更好的是,你的 applicationContext。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    • 1970-01-01
    相关资源
    最近更新 更多