2011-08-04 19 views
0

我試圖顯示一個對話框,說在地圖上等待GPS修復。但它會拋出BadTokenException。有人可以糾正我的代碼。我不一定需要一個對話框。它可以是一個'保持不變'的通知,並說等待GPS修復...一旦獲得修復,就會消失。請幫助我!等待GPS修復對話框拋出不良的令牌異常 - Android

package Firstdroid.Gps; 
import com.google.android.maps.*; 
import Firstdroid.Gps.R; 
import android.app.Dialog; 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 
import android.location.Location; 
import com.google.android.maps.GeoPoint; 
import com.google.android.maps.MapActivity; 
import com.google.android.maps.MapController; 
import com.google.android.maps.MapView; 
public class MapViewer extends MapActivity { 

    MyLocationOverlay myLocOverlay; 
    Location loc; 
    Dialog dialog; 
    private MapController mapController; 
    private MapView mapView; 
    private LocationManager locationManager; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle bundle) 
    { 
     super.onCreate(bundle); 
     setContentView(R.layout.map); 
     initMyLocation(); 
     mapView = (MapView) findViewById(R.id.mymap); 
     mapView.setBuiltInZoomControls(true); 
     mapView.setStreetView(true); 
     mapController = mapView.getController(); 
     mapController.setZoom(19); 
     locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
     locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 
       0, new GeoUpdateHandler()); 

    } 
    /** 
    * Initialises the MyLocationOverlay and adds it to the overlays of the map 
    */ 
    private void initMyLocation() { 
     //Runnable to determine when the first GPS fix was received. 
     Runnable showWaitDialog = new Runnable() { 
      @Override 
      public void run() { 
      while (loc == null) { 
      // Wait for first GPS Fix (do nothing until loc != null) 
      } 
      // After receiving first GPS Fix dismiss the Progress Dialog 
      dialog.dismiss(); 
      } 
      }; 
      // Create a Dialog to let the User know that we're waiting for a GPS Fix 
      dialog = ProgressDialog.show(getApplicationContext(), "Please wait...","Retrieving GPS data ...", true); 
      Thread t = new Thread(showWaitDialog); 
      t.start(); 
      while(loc !=null) 
      { 
      myLocOverlay = new MyLocationOverlay(this, mapView); 
      myLocOverlay.enableMyLocation(); 
      mapView.getOverlays().add(myLocOverlay); 
      //MapController mapController = mapView.getController(); 
      } 
    } 
    public class GeoUpdateHandler implements LocationListener { 

     @Override 
     public void onLocationChanged(Location location) { 
      int lat = (int) (location.getLatitude() * 1E6); 
      int lng = (int) (location.getLongitude() * 1E6); 
      GeoPoint point = new GeoPoint(lat, lng); 
      mapController.animateTo(point); // mapController.setCenter(point); 
     } 

     @Override 
     public void onProviderDisabled(String provider) { 
     } 

     @Override 
     public void onProviderEnabled(String provider) { 
     } 

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

    @Override 
    protected boolean isRouteDisplayed() { 
     return false; 
    } 
} 

錯誤日誌:

08-04 06:29:23.794: WARN/dalvikvm(8896): threadid=1: thread exiting with uncaught exception (group=0x400259f8) 
08-04 06:29:23.794: WARN/WindowManager(96): Attempted to add window with non-application token WindowToken{463f4b78 token=null}. Aborting. 
08-04 06:29:23.804: ERROR/AndroidRuntime(8896): FATAL EXCEPTION: main 
08-04 06:29:23.804: ERROR/AndroidRuntime(8896): java.lang.RuntimeException: Unable to start activity ComponentInfo{Firstdroid.Gps/Firstdroid.Gps.MapViewer}: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 
08-04 06:29:23.804: ERROR/AndroidRuntime(8896):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2787) 
08-04 06:29:23.804: ERROR/AndroidRuntime(8896):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2803) 
08-04 06:29:23.804: ERROR/AndroidRuntime(8896):  at android.app.ActivityThread.access$2300(ActivityThread.java:135) 
08-04 06:29:23.804: ERROR/AndroidRuntime(8896):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2136) 
08-04 06:29:23.804: ERROR/AndroidRuntime(8896):  at android.os.Handler.dispatchMessage(Handler.java:99) 
08-04 06:29:23.804: ERROR/AndroidRuntime(8896):  at android.os.Looper.loop(Looper.java:144) 
08-04 06:29:23.804: ERROR/AndroidRuntime(8896):  at android.app.ActivityThread.main(ActivityThread.java:4937) 
08-04 06:29:23.804: ERROR/AndroidRuntime(8896):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-04 06:29:23.804: ERROR/AndroidRuntime(8896):  at java.lang.reflect.Method.invoke(Method.java:521) 
08-04 06:29:23.804: ERROR/AndroidRuntime(8896):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
08-04 06:29:23.804: ERROR/AndroidRuntime(8896):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
08-04 06:29:23.804: ERROR/AndroidRuntime(8896):  at dalvik.system.NativeStart.main(Native Method) 
08-04 06:29:23.804: ERROR/AndroidRuntime(8896): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 
08-04 06:29:23.804: ERROR/AndroidRuntime(8896):  at android.view.ViewRoot.setView(ViewRoot.java:513) 
08-04 06:29:23.804: ERROR/AndroidRuntime(8896):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177) 
08-04 06:29:23.804: ERROR/AndroidRuntime(8896):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
08-04 06:29:23.804: ERROR/AndroidRuntime(8896):  at android.app.Dialog.show(Dialog.java:241) 
08-04 06:29:23.804: ERROR/AndroidRuntime(8896):  at android.app.ProgressDialog.show(ProgressDialog.java:107) 
08-04 06:29:23.804: ERROR/AndroidRuntime(8896):  at android.app.ProgressDialog.show(ProgressDialog.java:90) 
08-04 06:29:23.804: ERROR/AndroidRuntime(8896):  at Firstdroid.Gps.MapViewer.initMyLocation(MapViewer.java:64) 
08-04 06:29:23.804: ERROR/AndroidRuntime(8896):  at Firstdroid.Gps.MapViewer.onCreate(MapViewer.java:37) 
08-04 06:29:23.804: ERROR/AndroidRuntime(8896):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1069) 
08-04 06:29:23.804: ERROR/AndroidRuntime(8896):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2751) 
08-04 06:29:23.804: ERROR/AndroidRuntime(8896):  ... 11 more 
08-04 06:29:23.814: WARN/ActivityManager(96): Force finishing activity Firstdroid.Gps/.MapViewer 

回答

4

你傳遞給ProgressDialog上下文必須是Activity,不是Application

變化

dialog = ProgressDialog.show(getApplicationContext(), "Please wait...","Retrieving GPS data ...", true); 

到:

dialog = ProgressDialog.show(this, "Please wait...","Retrieving GPS data ...", true); 
+0

,解決它!非常感謝你!我如何將它作爲通知來代替? – adam

+0

你想要什麼樣的通知?敬酒或狀態欄通知? – Pikaling

+0

也請接受一些你的問題的答案 - 我注意到你在上一個問題中試圖從服務中打開對話框。你有幾個人,包括我自己在內,建議將它移動到一個活動中。這顯然對你有用,所以你應該接受其中一個答案。 – Pikaling

1

從錯誤看來你在這裏使用了錯誤的上下文。

dialog = ProgressDialog.show(getApplicationContext(), "Please wait...","Retrieving GPS data ...", true); 

所以,儘量使用這樣

dialog = ProgressDialog.show(MapViewer.this, "Please wait...","Retrieving GPS data ...", true); 
+0

這解決了它!我如何將它作爲通知而不是?如果解決了這個問題,可以使用 – adam

+0

。將其標記爲答案。並提出一個新問題 – Samuel