2013-02-04 198 views
1

我试图做一个定位服务,但不知怎的,我不能让它工作。 Lat和Lng始终为NULL。从服务中获取位置数据?

我对locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locListener);有一些例外,所以我把它放在run()的方法里,现在异常消失了。可能是什么问题呢?

那么定位服务的解决方案是什么?

代码:

public class LocationService extends Service { 

    private Timer timer = new Timer(); 

    private LocationManager locManager; 
    private LocationListener locListener = new MyLocationListener(); 

    private String latitude; 
    private String longitude; 
    private String providerToSend; 

    Messenger messenger; 
    Timer t = new Timer(); 

    @Override 
    public IBinder onBind(Intent arg0) { 
     return null; 
    } 

    public void onCreate() { 
     super.onCreate(); 

     locListener = new MyLocationListener(); 
     locationProviderInit(); 
     startService(); 

    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     shutdownService(); 

    } 

    private void startService() { 


     locManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); 

     String token = new SharedPreffer(this).loadPreferences("token"); 

      Log.d("Debug - token: ", "Van Token: " + token); 

      t.schedule(new TimerTask() { 

       @Override 
       public void run() { 

        locationProviderInit(); 

        if (latitude != null && longitude != null) { 

         Log.d("Debug - lat: ", latitude); 
         Log.d("Debug - lng: ", longitude); 

        } else { 

         Log.d("Debug - lat and lng are: ", "NULL"); 
        } 

       } 
      }, 0, 5000); 

    } 

    private void locationProviderInit() { 

     new Runnable() { 

      @Override 
      public void run() { 

       try { 

        boolean gps_enabled = locManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 
        boolean network_enabled = locManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 

        if (gps_enabled) { 
         locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locListener); 
         providerToSend = LocationManager.GPS_PROVIDER; 
        } 

        if (network_enabled) { 
         locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locListener); 
         providerToSend = LocationManager.NETWORK_PROVIDER; 
        } 

       } catch (Exception e) { 
        Log.d("Debug", e.toString()); 
       } 
      } 
     }; 

    } 


    class MyLocationListener implements LocationListener { 
     public void onLocationChanged(Location location) { 

      if (location != null) { 
       longitude = Double.toString(location.getLongitude()); 
       latitude = Double.toString(location.getLatitude()); 
      } 
     } 

     public void onProviderDisabled(String arg) { 
     } 

     public void onProviderEnabled(String arg) { 
     } 

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

    private void shutdownService() { 
     if (timer != null) 
      timer.cancel(); 
     Log.i(getClass().getSimpleName(), "Timer stopped!!!"); 
    } 

} 
+0

是什么异常? – iTech

回答

1

你不执行在locationProviderInit了Runnable ...

+0

这不提供问题的答案。要批评或要求作者澄清,在他们的帖子下留下评论 - 你可以随时评论你自己的帖子,一旦你有足够的[声誉](http://stackoverflow.com/faq#reputation),你将能够[评论任何帖子](http://stackoverflow.com/privileges/comment)。 – shadyyx

+0

对不起,我认为它确实回答了这个问题 - 我会澄清一下:runnable永远不会运行,因此您没有注册位置更新,您可以在run()函数中放置一个断点并查看它。没有注册位置更新,onLocationChanged()永远不会被调用。 – Sharp80

+0

好的,但一些更好的解释和更广泛的答案将不胜感激......这种一句话(或更差的一个两个字)的答案通常被认为是“回答垃圾邮件” - 这应该只是一个评论...如果没有什么可说的,请将其作为评论发布,如果OP将其视为正确答案您仍然可以将其作为回答发布,以回答claryfying您发布简短答案,因为它确实有助于解决问题:-) – shadyyx

1

你试过把一个调试消息的方法的run()在Runnable对象中的内部,看看它是否已经执行过?

定义Runnable实例而不使用它,例如。在一个线程内,将无法工作。

以下是几个可用作指导的开源GPS记录服务示例。

GPSLoggerService

GPSLoggingService