2013-12-08 97 views
-1

我是一個新的android我想找出gps位置並將它們定期保存在sqlite數據庫中,每件事情都很好。我希望當gps被啓用時,它將位置發送到數據庫,禁用時會顯示一個警報對話框以進行設置。但在這種情況下,當我禁用GPS停止工作,它會產生致命的異常。任何幫助,將不勝感激。應用程序崩潰,而提供程序在Locaton管理器中禁用

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 locarion =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; 
     NotificationManager nm; 
     Notification notification; 

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

      // 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) { 

      Log.d("Provider Disable", "Provider Diasble"); 

      showSettingsAlert(); 



     } 

     @Override 
     public void onProviderEnabled(String provider) { 
     // Toast.makeText(this, "Provider Enabled ", Toast.LENGTH_SHORT).show(); 
      Log.d("Provider Enable", "Provider Enable"); 


     } 

     @Override 
     public void onStatusChanged(String provider, int status, Bundle extras) { 
      //Log.d("Status changed", "status changed"); 

     } 

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

    } 

這是我的日誌

12-09 01:01:10.188: E/AndroidRuntime(13936): FATAL EXCEPTION: main 
12-09 01:01:10.188: E/AndroidRuntime(13936): android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] is not valid; is your activity running? 
12-09 01:01:10.188: E/AndroidRuntime(13936): at android.view.ViewRoot.setView(ViewRoot.java:527) 
12-09 01:01:10.188: E/AndroidRuntime(13936): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177) 
12-09 01:01:10.188: E/AndroidRuntime(13936): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
12-09 01:01:10.188: E/AndroidRuntime(13936): at android.view.Window$LocalWindowManager.addView(Window.java:424) 
12-09 01:01:10.188: E/AndroidRuntime(13936): at android.app.Dialog.show(Dialog.java:241) 
12-09 01:01:10.188: E/AndroidRuntime(13936): at android.app.AlertDialog$Builder.show(AlertDialog.java:802) 
12-09 01:01:10.188: E/AndroidRuntime(13936): at com.example.gps.GPSTracker.showSettingsAlert(GPSTracker.java:212) 
12-09 01:01:10.188: E/AndroidRuntime(13936): at com.example.gps.GPSTracker.onProviderDisabled(GPSTracker.java:242) 
12-09 01:01:10.188: E/AndroidRuntime(13936): at android.location.LocationManager$ListenerTransport._handleMessage(LocationManager.java:240) 
12-09 01:01:10.188: E/AndroidRuntime(13936): at android.location.LocationManager$ListenerTransport.access$000(LocationManager.java:160) 
12-09 01:01:10.188: E/AndroidRuntime(13936): at android.location.LocationManager$ListenerTransport$1.handleMessage(LocationManager.java:176) 
12-09 01:01:10.188: E/AndroidRuntime(13936): at android.os.Handler.dispatchMessage(Handler.java:99) 
12-09 01:01:10.188: E/AndroidRuntime(13936): at android.os.Looper.loop(Looper.java:123) 
12-09 01:01:10.188: E/AndroidRuntime(13936): at android.app.ActivityThread.main(ActivityThread.java:3683) 
12-09 01:01:10.188: E/AndroidRuntime(13936): at java.lang.reflect.Method.invokeNative(Native Method) 
12-09 01:01:10.188: E/AndroidRuntime(13936): at java.lang.reflect.Method.invoke(Method.java:507) 
12-09 01:01:10.188: E/AndroidRuntime(13936): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
12-09 01:01:10.188: E/AndroidRuntime(13936): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
12-09 01:01:10.188: E/AndroidRuntime(13936): at dalvik.system.NativeStart.main(Native Method) 

回答

0

您正在嘗試使用您傳遞到您的GPS追蹤器作爲其上下文的活動以顯示一個對話框窗口,但活動不再可用,因此你的錯誤告訴你上下文的消息是無效的。

您可能想要啓動一個活動,並將其設置爲對話框樣式。

Launch AlertDialog not from an Activity

+0

如何解決這個 – user3080618

+0

只推出具有有效的活動,以附加到alertdialog。 – Kuffs

+0

你可以修改代碼,這將有助於我站在下面 – user3080618