2013-07-26 39 views
0

我试图从服务打开设置的对话,但在运行它,它给警告WindowManagerBadTokenException- unable to add window.为什么它给这样的警告?下面的代码给出:无法添加窗口警告在Android应用

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; 
    } 

} 
+0

你可以发布你的踪迹吗? – Rajeev

+0

@Rajeev跟踪? –

回答

1

您使用了错误的Context

一个BroadcastReceiverService无法启动对话框。

您应该作出Activity与对话的主题,并与startActivity()

<activity android:theme="@android:style/Theme.Dialog" /> 
+0

@lon Aalber,其实我是一个新手,在这一点,真的很困惑,我已经创建了一个活动,推出我的服务和服务将继续执行,但不活动,服务必须检查不时GPS是否开启与否,一如果它是不是会推出settings.so的对话框我怎样才能做到这一点?还有一两件事,当我从任何活动调用GPS类(在其定义对话框),它运作良好。 –

0

启动它AFAIK你不能从服务显示对话框。

如何显示通知用户,如果GPS没有被激活,一旦在通知用户点击,你可以带他去设置屏幕。(这是推荐的方法,如果你想通知从服务中使用。)

下面的教程会给你很好的了解如何在android中显示通知。

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

+0

我试图执行通知,但通知是不可见的... –

相关问题