2013-03-29 33 views
0

启动服务后:onLocationChanged不会被调用,甚至请求更新

AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 
Intent i = new Intent(this, LocationService.class); 
pi = PendingIntent.getService(this, 0, i, 
     PendingIntent.FLAG_UPDATE_CURRENT); 
am.cancel(pi); 
am.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
     SystemClock.elapsedRealtime(), 30*1000, pi); 

服务:

public class LocationService extends Service implements LocationListener { 

    public static double curLat = 0.0; 
    public static double curLng = 0.0; 
    private LocationManager mgr; 
    private String best; 
    private Location location; 

    @Override 
    public IBinder onBind(Intent arg0) { 

     return null; 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 

     mgr = (LocationManager) getSystemService(LOCATION_SERVICE); 
     best = LocationManager.NETWORK_PROVIDER; 
     location = mgr.getLastKnownLocation(best); 
     if (location != null) { 

      dumpLocation(location); 
      mgr.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 
        5 * 1000, 0, this); 
     } 
     return START_NOT_STICKY; 
     } 
    } 

    private void dumpLocation(Location l) { 

     SimpleDateFormat s = new SimpleDateFormat("dd/MM/yyyy:hh:mm:ss", 
       Locale.ENGLISH); 
     String format = s.format(l.getTime()); 
     //The above time is always 21/03/2013:09:53:41 which is more than a week old 
     curLat = l.getLatitude(); 
     curLng = l.getLongitude(); 
    } 

    @Override 
    public void onLocationChanged(Location location) { 

     //This never seems to be called 
     dumpLocation(location); 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 

    } 

    @Override 
    public void onProviderEnabled(String provider) { 

    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 

    } 
} 

每30秒的服务被调用,但requestLocationUpdates似乎从来没有致电onLocationChanged。当我检查了一周前lastKnownLocation的时间。

像foursquare,本地,地图等应用程序给出当前位置禁用GPS。

我错过了什么?

+0

在旁注:位置更新可以返回空位置。一定要处理它... – Warpzit

+0

你在设备或模拟器中测试?你的GPS是否启用?你是否像露天环境一样在外面进行测试? – Lucifer

+0

@Warpzit,是的。但我正在获得一个位置。我转储并获取时间戳。 –

回答

1

我认为你需要从设备的某处移动,因为onLocationChange只有在位置发生变化时才会调用。而网络位置大约在1000-2000米附近,因此需要检查位置发生变化的街道并获取新位置。如果你使用GPS,那么它会给你准确,但它也固定在20-30米附近。

+0

+1,但并不完全同意你的电表计算,因为当我使用NETWORK_PROVIDER时,即使有5米也会给出结果,但主要是改变位置(移动)。 – Lucifer

+0

是的,但其他应用程序都可以给出确切的位置(没有GPS并且没有移动)。实际上,在其他设备上,虽然位置未更改,但每次调用该服务(30秒)时都会调用onLocationChanged,并且TimeStamp是当前时间。 –

+0

我试过重新启动设备。现在每隔30秒就会调用LocationChanged,即使没有移动,新的位置如56m准确,55m准确等等,经纬度变化很小。可能与设备有关。但其他应用程序让我想知道他们如何获得位置。一段时间后也可能会遇到同样的问题。任何想法如何解决这种情况? –

相关问题