2011-01-23 108 views
8

我打电话的方法,并期望位置更新多次:我loc_listener被定义为位置管理的requestLocationUpdates只调用一次

locationManager.requestLocationUpdates("gps",0 ,0, 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); 

你们有见过这样的事?

+1

您可以使用NETWORK_PROVIDER获得快速定位... – Anand 2011-01-23 07:16:41

+0

我的应用程序只需要很好的位置。没有它,大部分功能都会丢失。 – 2011-01-23 07:24:38

回答

14

我从来没有见过这个问题。以下是我测试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); 
    } 
}