2011-08-04 46 views
0

我试图执行以下代码...但AlertDialog正在创建问题!没有这个代码工作正常。我想要一个对话框弹出并要求用户在GPS关闭时启用GPS!Android中的运行时异常AlertDialog

public class Testing extends Service { 
    private Location loc; 
    private Dialog dialog; 
    String DATA; 
    @Override 
    public IBinder onBind(Intent arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 
    @Override 
    public void onCreate() 
    {  
      super.onCreate(); 
    } 
    @Override 
    public void onStart(Intent intent, int startId) 
    { 
     LocationManager LM = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
     if (!LM.isProviderEnabled(LocationManager.GPS_PROVIDER)){ 
      AlertDialog.Builder builder = new AlertDialog.Builder(this); 
      builder.setMessage("Your GPS is disabled! Would you like to enable it?") 
        .setCancelable(false).setPositiveButton("Enable GPS", 
          new DialogInterface.OnClickListener() { 
           public void onClick(DialogInterface dialog, int id) { 
            Intent gpsOptionsIntent = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
            startActivity(gpsOptionsIntent); 
           } 
          }); 
      builder.setNegativeButton("Do nothing", 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int id) { 
          dialog.cancel(); 
         } 
        }); 
      AlertDialog alert = builder.create(); 
      alert.show(); 
     } 
     LocationListener LL = new MyLocationListener(); 
     LM.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 0, LL); 
     LM.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, LL); 
     /*//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();*/ 
     LM.addNmeaListener(new NmeaListener() { 
     public void onNmeaReceived(long timestamp, String nmea) 
     { 
        DATA = nmea; 
     }}); 
    } 

但我得到这个错误!注释行内的ProgressDialog代码也会引发相同的错误!

08-04 04:36:09.664: ERROR/AndroidRuntime(6301): FATAL EXCEPTION: main 
08-04 04:36:09.664: ERROR/AndroidRuntime(6301): java.lang.RuntimeException: Unable to start service [email protected] with Intent { cmp=Firstdroid.Gps/.Testing }: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 
08-04 04:36:09.664: ERROR/AndroidRuntime(6301):  at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3282) 
08-04 04:36:09.664: ERROR/AndroidRuntime(6301):  at android.app.ActivityThread.access$3600(ActivityThread.java:135) 
08-04 04:36:09.664: ERROR/AndroidRuntime(6301):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2211) 
08-04 04:36:09.664: ERROR/AndroidRuntime(6301):  at android.os.Handler.dispatchMessage(Handler.java:99) 
08-04 04:36:09.664: ERROR/AndroidRuntime(6301):  at android.os.Looper.loop(Looper.java:144) 
08-04 04:36:09.664: ERROR/AndroidRuntime(6301):  at android.app.ActivityThread.main(ActivityThread.java:4937) 
08-04 04:36:09.664: ERROR/AndroidRuntime(6301):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-04 04:36:09.664: ERROR/AndroidRuntime(6301):  at java.lang.reflect.Method.invoke(Method.java:521) 
08-04 04:36:09.664: ERROR/AndroidRuntime(6301):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
08-04 04:36:09.664: ERROR/AndroidRuntime(6301):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
08-04 04:36:09.664: ERROR/AndroidRuntime(6301):  at dalvik.system.NativeStart.main(Native Method) 
08-04 04:36:09.664: ERROR/AndroidRuntime(6301): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 
08-04 04:36:09.664: ERROR/AndroidRuntime(6301):  at android.view.ViewRoot.setView(ViewRoot.java:513) 
08-04 04:36:09.664: ERROR/AndroidRuntime(6301):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177) 
08-04 04:36:09.664: ERROR/AndroidRuntime(6301):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
08-04 04:36:09.664: ERROR/AndroidRuntime(6301):  at android.app.Dialog.show(Dialog.java:241) 
08-04 04:36:09.664: ERROR/AndroidRuntime(6301):  at Firstdroid.Gps.UrbanExplorer.onStart(UrbanExplorer.java:84) 
08-04 04:36:09.664: ERROR/AndroidRuntime(6301):  at android.app.Service.onStartCommand(Service.java:420) 
08-04 04:36:09.664: ERROR/AndroidRuntime(6301):  at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3267) 
08-04 04:36:09.664: ERROR/AndroidRuntime(6301):  ... 10 more 

回答

3

这是不可能显示从Service一个对话框(而不是Activity)。

摘自Dialog文档发现here

始终创建一个对话框并显示为Activity的一部分。您通常应该从ActivityonCreateDialog(int)回调方法中创建对话框。

实际上,显示来自Service的对话框违反了Android UI guidelines。指南建议使用通知。

如果你真的需要,你可以启动Activity,看上去就像一个Dialog,被描述here,但仍不明智的,你可能会打扰用户,当他/她在另一个中间活动。

2

你不应该试图从Service推出Dialog。检查供应商是否从Activity启用,并且如果不创建Dialog。如果它们已启用,请启动Service

1

您无法从服务打开对话框,因此您必须将对话作为活动,并且必须从服务中启动该活动。 有关对话活动详情,请参见该问题

android:chat app popup view