2012-01-08 28 views
0

我正在準備一個應用程序,點擊一個按鈕檢索它是當前的GPS座標。Android的GPS錯誤

當我將所有編碼放在主要活動類中時,應用程序將完美執行,並顯示所需的結果。

但是,我嘗試拆分類並將GPS連接方法放置在單獨的java類中,並從主活動類中調用它們。

我設法對代碼進行分析,並計算出這部分導致了該問題(給力密切錯誤,而測試):

mgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 30000, 100,mlocListener); 

可有人善意解釋爲什麼我不管理使用位置服務在Java類中。上點擊方法

01-08 02:21:30.589: I/ApplicationPackageManager(17978): cscCountry is not German : XEO 
01-08 02:21:51.499: D/AndroidRuntime(17978): Shutting down VM 
01-08 02:21:51.499: W/dalvikvm(17978): threadid=1: thread exiting with uncaught exception (group=0x40018578) 
01-08 02:21:51.509: E/AndroidRuntime(17978): FATAL EXCEPTION: main 
01-08 02:21:51.509: E/AndroidRuntime(17978): java.lang.NullPointerException 
01-08 02:21:51.509: E/AndroidRuntime(17978): at stefan.thesistest.Gpsconnection.connect(Gpsconnection.java:25) 
01-08 02:21:51.509: E/AndroidRuntime(17978): at stefan.thesistest.ThesistestActivity$1.onClick(ThesistestActivity.java:41) 
01-08 02:21:51.509: E/AndroidRuntime(17978): at android.view.View.performClick(View.java:2485) 
01-08 02:21:51.509: E/AndroidRuntime(17978): at android.view.View$PerformClick.run(View.java:9080) 
01-08 02:21:51.509: E/AndroidRuntime(17978): at android.os.Handler.handleCallback(Handler.java:587) 
01-08 02:21:51.509: E/AndroidRuntime(17978): at android.os.Handler.dispatchMessage(Handler.java:92) 
01-08 02:21:51.509: E/AndroidRuntime(17978): at android.os.Looper.loop(Looper.java:123) 
01-08 02:21:51.509: E/AndroidRuntime(17978): at android.app.ActivityThread.main(ActivityThread.java:3687) 
01-08 02:21:51.509: E/AndroidRuntime(17978): at java.lang.reflect.Method.invokeNative(Native Method) 
01-08 02:21:51.509: E/AndroidRuntime(17978): at java.lang.reflect.Method.invoke(Method.java:507) 
01-08 02:21:51.509: E/AndroidRuntime(17978): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 
01-08 02:21:51.509: E/AndroidRuntime(17978): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 
01-08 02:21:51.509: E/AndroidRuntime(17978): at dalvik.system.NativeStart.main(Native Method) 

主要活動類:

output = (TextView) findViewById(R.id.textView1); 
    button = (Button) findViewById(R.id.button1); 


    button.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 


      Gpsconnection.connect(); 

      int test4 = Global.flag; 
      double test1 = Global.lat1; 
      double test2 = Global.lat2; 


      String tot = new Double(test1).toString(); 
      String tot2 = new Double(test2).toString(); 


      if(test4 == 2){ 
       output.setText("GPS IS NOT ON");     
      } 

      if(test4 ==3){ 
       output.setText("STILL WAITING CONECTION"); 

      } 
      if(test4 ==4){ 
       output.setText("Latitude:- " + tot 
         + '\n' + "Longitude:- " + tot2 
         + '\n'); 

      } 
     }; 

});

Java類(GPS檢索方法):

public static void connect(){ 

    LocationManager mgr; 

     mgr = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
     LocationListener mlocListener = new LocationManagerHelper(); 
     mgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 30000, 100,mlocListener); 


     if (mgr.isProviderEnabled(LocationManager.GPS_PROVIDER)) {// if gps is on 
      Global.flag=1; 
       Global.lat1 = LocationManagerHelper.getLatitude(); 
       Global.lat2 = LocationManagerHelper.getLongitude(); 

       if(Global.lat1 == 0.0 && Global.lat2 == 0.0){ 
        Global.flag=3; 
       } 
       else{Global.flag=4;} 
     } else { 
     Global.flag=2;//gps is off 

     } 

} 


public static class LocationManagerHelper implements LocationListener { 

       private static double latitude; 
       private static double longitude; 

       @Override    
       public void onLocationChanged(Location loc) { 

        latitude = loc.getLatitude(); 
        longitude = loc.getLongitude(); 
       } 

       @Override 
       public void onProviderDisabled(String provider) { } 

       @Override 
       public void onProviderEnabled(String provider) { } 

       @Override 
       public void onStatusChanged(String provider, int status, Bundle extras) { 
        // TODO Auto-generated method stub 
       } 

       public static double getLatitude() { 
        return latitude; 
       } 

       public static double getLongitude() { 
        return longitude; 
       } 

      } 
+0

你可以發佈堆棧從日誌 – nandeesh 2012-01-08 01:19:55

+0

你有NPE在onclick論文的測試活動方法,也發佈onclick方法 – nandeesh 2012-01-08 01:26:37

+0

我們需要多行代碼......發佈更多請。 – Cody 2012-01-08 01:27:14

回答

1

你有NullPointerException。檢查未初始化變量

UPDATE:

能否請您查看使用調試器,如果mgr不在行mgr.requestLocationUpdates

1

我認爲問題是,當你撥打:

Global.lat1 = LocationManagerHelper.getLatitude(); 
Global.lat2 = LocationManagerHelper.getLongitude(); 

的GPS沒有固定的位置,但和您的經度和緯度都尚未確定。使用偵聽器的要點是需要時間進行位置修復,並且在requestUpdates()之後立即調用這些方法時無法工作。我很驚訝他們在合併課程時會這樣做,那可能是因爲你的GPS已經連接到衛星上了嗎?在那種特殊情況下,它會起作用。

取而代之的是,在您的onLocationChange(位置更改)中,必須在您的活動中觸發某個操作,並且可以使用回調來實現該操作。

This excellent post提供了一個很好的例子和一個你可以使用的類。

+0

它有助於解決您的問題嗎? – znat 2012-01-08 20:19:41