Исключение времени выполнения AlertDialog в Android - PullRequest
0 голосов
/ 04 августа 2011

Я пытаюсь выполнить следующий код ... но AlertDialog создает проблемы!Без этого код работает нормально.Я хочу, чтобы диалоговое окно всплыло и попросило пользователя включить GPS, когда оно выключено!

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 Firstdroid.Gps.Testing@462a35d0 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 ]

3 голосов
/ 04 августа 2011

Невозможно отобразить диалог из Service (в отличие от Activity).

Выдержка из Dialog найдена документация здесь

Диалог всегда создается и отображается как часть Activity.Обычно вы должны создавать диалоги из вашего onCreateDialog(int) метода обратного вызова.

На самом деле, показ диалога из Service нарушает правила Android UI ,Руководящие принципы рекомендуют вместо этого использовать уведомления.

Если вам действительно нужно, вы можете запустить Activity, который выглядит и ведет себя как Dialog, который описан здесь , но все еще болен-совет, что вы можете прерывать пользователя, когда он / она находится в середине другого действия.

2 голосов
/ 04 августа 2011

Вы не должны пытаться запустить Dialog с Service.Проверьте, включены ли провайдеры с Activity, и если нет, создайте Dialog.Если они включены, запустите Service.

1 голос
/ 04 августа 2011

Вы не можете открыть диалоговое окно из Сервиса, поэтому вы должны сделать действие в виде диалога и запустить это действие из своего сервиса.Подробнее о диалоге «Активность» см. Этот вопрос

android: всплывающее окно чата

...