2013-02-04 91 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