【问题标题】:Location Manager's requestLocationUpdates called only once位置管理器 requestLocationUpdates 仅调用一次
【发布时间】:2011-01-23 07:02:29
【问题描述】:

我正在调用该方法并期望多次更新位置:

locationManager.requestLocationUpdates("gps",0 ,0, loc_listener);

我的loc_listener 定义为:

LocationListener loc_listener = new LocationListener() {
    private final String TAG = "xoxoxo.LocationListener";

    public void onLocationChanged(Location l) {
        Intent locationAlert = new Intent("xoxoxo.LOCATION_CHANGED")
                .putExtra("target_location", l);
        sendBroadcast(locationAlert);
        // locationManager.requestLocationUpdates("gps", 0 ,0, this);
    }

    public void onProviderEnabled(String p) {
        Log.i(TAG, "Provider enabled");
    }

    public void onProviderDisabled(String p) {
        Log.i(TAG, "Provider disabled");
    }

    public void onStatusChanged(String p, int status, Bundle extras) {
        Log.i(TAG, "Status changed");
    }
};

按原样定义,我只会在 HTC Evo 2.2 和 2.2 + Google API 模拟器上获得一次更新。 获得多个更新的技巧是取消注释每次更新时注册更新的行:

locationManager.requestLocationUpdates("gps", 0 ,0, this);

你们见过这样的吗?

【问题讨论】:

  • 您可以使用 NETWORK_PROVIDER 快速定位...
  • 我的应用程序只需要很好的位置。没有它,很多功能都会丢失。
  • 对于 gps 提供商,您需要开阔的天空条件,以便它可以非常快速准确地更新,但如果您在建筑物内,您需要实施网络提供商,因为至少要获得不太准确的更新位置与 GPS 相比。
  • 阿南德,我又不能使用网络位置。用户总是在外面。

标签: android location


【解决方案1】:

我从未见过这个问题。以下是我测试 LocationManager 和 LocationListener 的代码。当 LocationListener 实现为匿名类时,它按预期工作。

package com.test.locationmanager;

import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.os.Bundle;
import android.widget.TextView;

public class LocationManagerStatus extends Activity {

    private LocationManager locationManager;
    private TextView textView;
    private final LocationListener gpsLocationListener =new LocationListener(){

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            final String tvTxt = textView.getText().toString();
            switch (status) {
            case LocationProvider.AVAILABLE:
                textView.setText(tvTxt + "GPS available again\n");
                break;
            case LocationProvider.OUT_OF_SERVICE:
                textView.setText(tvTxt + "GPS out of service\n");
                break;
            case LocationProvider.TEMPORARILY_UNAVAILABLE:
                textView.setText(tvTxt + "GPS temporarily unavailable\n");
                break;
            }
        }

        @Override
        public void onProviderEnabled(String provider) {
            textView.setText(textView.getText().toString()
                    + "GPS Provider Enabled\n");
        }

        @Override
        public void onProviderDisabled(String provider) {
            textView.setText(textView.getText().toString()
                    + "GPS Provider Disabled\n");
        }

        @Override
        public void onLocationChanged(Location location) {
            locationManager.removeUpdates(networkLocationListener);
            textView.setText(textView.getText().toString()
                    + "New GPS location: "
                    + String.format("%9.6f", location.getLatitude()) + ", "
                    + String.format("%9.6f", location.getLongitude()) + "\n");
        }
    };
    private final LocationListener networkLocationListener =
                                                        new LocationListener(){

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras){
            final String tvTxt = textView.getText().toString();
            switch (status) {
            case LocationProvider.AVAILABLE:
                textView.setText(tvTxt + "Network location available again\n");
                break;
            case LocationProvider.OUT_OF_SERVICE:
                textView.setText(tvTxt + "Network location out of service\n");
                break;
            case LocationProvider.TEMPORARILY_UNAVAILABLE:
                textView.setText(tvTxt
                        + "Network location temporarily unavailable\n");
                break;
            }
        }

        @Override
        public void onProviderEnabled(String provider) {
            textView.setText(textView.getText().toString()
                    + "Network Provider Enabled\n");
        }

        @Override
        public void onProviderDisabled(String provider) {
            textView.setText(textView.getText().toString()
                    + "Network Provider Disabled\n");
        }

        @Override
        public void onLocationChanged(Location location) {
            textView.setText(textView.getText().toString()
                    + "New network location: "
                    + String.format("%9.6f", location.getLatitude()) + ", "
                    + String.format("%9.6f", location.getLongitude()) + "\n");
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        textView = (TextView) findViewById(R.id.textview);
        locationManager = (LocationManager) 
                getSystemService(Context.LOCATION_SERVICE);
    }

    @Override
    protected void onResume() {
        super.onResume();
        locationManager.requestLocationUpdates(
                LocationManager.NETWORK_PROVIDER, 5000, 0,
                networkLocationListener);
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                3000, 0, gpsLocationListener);
    }

    @Override
    protected void onPause() {
        super.onPause();
        locationManager.removeUpdates(networkLocationListener);
        locationManager.removeUpdates(gpsLocationListener);
    }
}

【讨论】:

    猜你喜欢
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 2013-05-02
    • 1970-01-01
    • 2016-07-28
    • 2017-10-02
    相关资源
    最近更新 更多