0

我正在尝试从服务打开设置对话框,但是在运行它时,它会发出警告WindowManagerBadTokenException- unable to add window.为什么会发出这样的警告?代码如下:

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import android.app.Activity;
import android.app.PendingIntent;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.telephony.SmsManager;
import android.util.Log;

public class FirstService extends Service {

    Timer t;
    int time = 0;


    @Override
    public IBinder onBind(Intent arg0) {

        // TODO Auto-generated method stub
        return null;

    }


    @Override
    public void onStart(Intent intent, int startId) {

        Log.e("time", time+++"");
        lat_long();


    }

    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();

    }


    public void lat_long() {
        GPSTracker gps = new GPSTracker(this);
        Date date = Calendar.getInstance().getTime();
        SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yy");
        SimpleDateFormat formatter1 = new SimpleDateFormat("HH:mm:ss");
        String timerr1 = formatter.format(date);
        String timerr2 = formatter1.format(date);

        if (gps.canGetLocation) {
            double latitude = gps.getLatitude();
            double longitude = gps.getLongitude();

            String ph = "8445590443";
            //"9639002709";

            if (latitude > 0 && longitude > 0) {
                sendSMS(ph, "LOC=" + latitude + "=" + longitude + "=" + timerr1 + "=" + timerr2);
            }
        } else {
            Log.e("time", timerr1 + "and" + timerr2);

        }


    }


    private void sendSMS(String phoneNumber, String message) {
        /*
        PendingIntent pi = PendingIntent.getActivity(this, 0,
                new Intent(this, test.class), 0);                
            SmsManager sms = SmsManager.getDefault();
            sms.sendTextMessage(phoneNumber, null, message, pi, null);        
        */

        String SENT = "SMS_SENT";
        String DELIVERED = "SMS_DELIVERED";

        PendingIntent pi = PendingIntent.getBroadcast(this, 0,
            new Intent(SENT), 0);
        PendingIntent pi1 = PendingIntent.getBroadcast(this, 0,
            new Intent(DELIVERED), 0);



        //---when the SMS has been sent---
        registerReceiver(new BroadcastReceiver() {


            @Override
            public void onReceive(Context arg0, Intent arg1) {


                switch (getResultCode()) {
                case Activity.RESULT_OK:

                    break;
                case SmsManager.RESULT_ERROR_GENERIC_FAILURE:

                    break;
                case SmsManager.RESULT_ERROR_NO_SERVICE:

                    break;
                case SmsManager.RESULT_ERROR_NULL_PDU:

                    break;
                case SmsManager.RESULT_ERROR_RADIO_OFF:

                    break;
                }
            }
        }, new IntentFilter(SENT));


        registerReceiver(new BroadcastReceiver() {

            @Override
            public void onReceive(Context arg0, Intent arg1) {
                switch (getResultCode()) {
                case Activity.RESULT_OK:

                    break;
                case Activity.RESULT_CANCELED:

                    break;
                }

            }
        }, new IntentFilter(DELIVERED));


        SmsManager sms = SmsManager.getDefault();
        sms.sendTextMessage(phoneNumber, null, message, pi, pi1);

    }
}

我在打开 GPS 的服务中调用的另一个类是:

package test.sai;


public class GPSTracker extends Service implements LocationListener {

    private final Context mContext;



    // flag for GPS status
    boolean isGPSEnabled = false;

    // flag for network status
    boolean isNetworkEnabled = false;

    // flag for GPS status
    boolean canGetLocation = false;
    boolean hasLocation = false;

    Location location; // location
    double latitude; // latitude
    double longitude; // longitude

    // The minimum distance to change Updates in meters
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters

    // The minimum time between updates in milliseconds
    private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute

    // Declaring a Location Manager
    protected LocationManager locationManager;


    public GPSTracker(Context context) {
        this.mContext = context;
        getLocation();
    }

    public Location getLocation() {
        try {
            locationManager = (LocationManager) mContext
                .getSystemService(LOCATION_SERVICE);

            // getting GPS status
            isGPSEnabled = locationManager
                .isProviderEnabled(LocationManager.GPS_PROVIDER);

            // getting network status
            isNetworkEnabled = locationManager
                .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

            if (!isGPSEnabled || !isNetworkEnabled) {
                // no network provider is enabled
                showSettingsAlert();
            } else {
                this.canGetLocation = true;
                // First get location from Network Provider
                if (isNetworkEnabled) {
                    locationManager.requestLocationUpdates(
                        LocationManager.NETWORK_PROVIDER,
                        MIN_TIME_BW_UPDATES,
                        MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    Log.d("Network", "Network");
                    if (locationManager != null) {
                        location = locationManager
                            .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }
                // if GPS Enabled get lat/long using GPS Services
                if (isGPSEnabled) {
                    if (location == null) {
                        locationManager.requestLocationUpdates(
                            LocationManager.GPS_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                        Log.d("GPS Enabled", "GPS Enabled");
                        if (locationManager != null) {
                            location = locationManager
                                .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                            if (location != null) {
                                latitude = location.getLatitude();
                                longitude = location.getLongitude();
                            }
                        }
                    }
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        return location;
    }

    /**
     * Stop using GPS listener
     * Calling this function will stop using GPS in your app
     * */
    public void stopUsingGPS() {
        if (locationManager != null) {
            locationManager.removeUpdates(GPSTracker.this);
        }
    }

    /**
     * Function to get latitude
     * */
    public double getLatitude() {
        if (location != null) {
            latitude = location.getLatitude();
        }

        // return latitude
        return latitude;
    }

    /**
     * Function to get longitude
     * */
    public double getLongitude() {
        if (location != null) {
            longitude = location.getLongitude();
        }

        // return longitude
        return longitude;
    }

    /**
     * Function to check GPS/wifi enabled
     * @return boolean
     * */
    public boolean canGetLocation() {
        return this.canGetLocation;
    }

    /**
     * Function to show settings alert dialog
     * On pressing Settings button will lauch Settings Options
     * */
    public void showSettingsAlert() {
        AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);

        // Setting Dialog Title
        alertDialog.setTitle("GPS settings");

        // Setting Dialog Message
        alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?");

        // On pressing Settings button
        alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                mContext.startActivity(intent);
                Log.e("enabled", "before progress bar");


            }
        });

        // on pressing cancel button
        alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
            }
        });

        // Showing Alert Message
        alertDialog.show();
    }

    @Override
    public void onLocationChanged(Location location) {}

    @Override
    public void onProviderDisabled(String provider) {}

    @Override
    public void onProviderEnabled(String provider) {

    }

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

    }

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

}
4

2 回答 2

1

你用错了Context

ABroadcastReceiver或 aService无法启动 Dialog。

您应该Activity使用对话框主题制作并启动它startActivity()

<activity android:theme="@android:style/Theme.Dialog" />
于 2013-07-26T10:05:48.803 回答
0

AFAIK 你不能从服务中显示对话。

如果 GPS 未激活,如何向用户显示通知,并且一旦用户单击通知,您就可以将他带到设置屏幕。(如果您想从服务中通知使用,这是推荐的方法。)

下面的教程将让您很好地了解如何在 android 中显示通知。

http://www.vogella.com/articles/AndroidNotifications/article.html

于 2013-07-26T10:14:41.397 回答