2013-07-26 38 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

我試圖執行通知,但通知是不可見的... –

相關問題