2013-04-28 52 views
0

請有人給我一個代碼可以恢復GPS位置或每n分鐘,我測試了幾個代碼,但沒有結果如何獲得定位對象,每10分鐘的Android

請人給我的教程或小程序對於這一點,我真的堅持

public final class TrackListener implements LocationListener { 

    private final Context mContext; 
    public boolean isGPSEnabled = false; 
    boolean isNetworkEnabled = false; 
    public boolean canGetLocation = 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 TrackListener(Context context) { 
     this.mContext = context; 
     getLocation(); 
    } 
    public Location getLocation() { 
     try { 
      locationManager = (LocationManager) mContext 
        .getSystemService(Contexts.LOCATION_SERVICE); 
      isGPSEnabled = locationManager 
        .isProviderEnabled(LocationManager.GPS_PROVIDER); 

      Log.v("isGPSEnabled", "=" + isGPSEnabled); 
      isNetworkEnabled = locationManager 
        .isProviderEnabled(LocationManager.NETWORK_PROVIDER); 

      Log.v("isNetworkEnabled", "=" + isNetworkEnabled); 

      if (isGPSEnabled == false && isNetworkEnabled == false) { 
      } else { 
       this.canGetLocation = true; 
       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 (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; 
    } 
    public void stopUsingGPS() { 
     if (locationManager != null) { 
      locationManager.removeUpdates(TrackListener.this); 
     } 
    } 
    public double getLatitude() { 
     if (location != null) { 
      latitude = location.getLatitude(); 
     } 
     return latitude; 
    } 
    public double getLongitude() { 
     if (location != null) { 
      longitude = location.getLongitude(); 
     } 
     return longitude; 
    } 
    public boolean canGetLocation() { 
     return this.canGetLocation; 
    } 
    public void showSettingsAlert() { 
     AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext); 
     alertDialog.setTitle("GPS is settings"); 
     alertDialog 
       .setMessage("GPS is not enabled. Do you want to go to settings menu?"); 
     alertDialog.setPositiveButton("Settings", 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
         Intent intent = new Intent(
           "ACTION_LOCATION_SOURCE_SETTINGS"); 
         mContext.startActivity(intent); 
        } 
       }); 
     alertDialog.setNegativeButton("Cancel", 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.cancel(); 
        } 
       }); 
     alertDialog.show(); 
    } 

    public void onLocationChanged(Location location) { 
     if (location != null) { 
      latitude = location.getLatitude(); 
      longitude = location.getLongitude(); 
     } 
    } 
    @Override 
    public void onProviderDisabled(String provider) { 
     Toast.makeText(Contexts.getAppContext(), "GPS Disable ", 
       Toast.LENGTH_LONG).show(); 
    } 
    @Override 
    public void onProviderEnabled(String provider) { 
     Toast.makeText(Contexts.getAppContext(), "GPS enabled", 
       Toast.LENGTH_LONG).show(); 
    } 

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

但打電話時「的getLocation()」中的課堂活動我發現一個致命的問題

04-28 08:41:55.126: W/dalvikvm(16004): threadid=1: thread exiting with uncaught exception (group=0x40015560) 
    04-28 08:41:55.186: E/AndroidRuntime(16004): FATAL EXCEPTION: main 
    04-28 08:41:55.186: E/AndroidRuntime(16004): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.testss/com.example.testss.MainActivity}: java.lang.NullPointerException 
    04-28 08:41:55.186: E/AndroidRuntime(16004): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647) 
    04-28 08:41:55.186: E/AndroidRuntime(16004): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 
    04-28 08:41:55.186: E/AndroidRuntime(16004): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
    04-28 08:41:55.186: E/AndroidRuntime(16004): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
    04-28 08:41:55.186: E/AndroidRuntime(16004): at android.os.Handler.dispatchMessage(Handler.java:99) 
    04-28 08:41:55.186: E/AndroidRuntime(16004): at android.os.Looper.loop(Looper.java:123) 
    04-28 08:41:55.186: E/AndroidRuntime(16004): at android.app.ActivityThread.main(ActivityThread.java:3683) 
    04-28 08:41:55.186: E/AndroidRuntime(16004): at java.lang.reflect.Method.invokeNative(Native Method) 
    04-28 08:41:55.186: E/AndroidRuntime(16004): at java.lang.reflect.Method.invoke(Method.java:507) 
    04-28 08:41:55.186: E/AndroidRuntime(16004): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
    04-28 08:41:55.186: E/AndroidRuntime(16004): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
    04-28 08:41:55.186: E/AndroidRuntime(16004): at dalvik.system.NativeStart.main(Native Method) 
    04-28 08:41:55.186: E/AndroidRuntime(16004): Caused by: java.lang.NullPointerException 
    04-28 08:41:55.186: E/AndroidRuntime(16004): at com.example.testss.MainActivity.onCreate(MainActivity.java:27) 
    04-28 08:41:55.186: E/AndroidRuntime(16004): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
    04-28 08:41:55.186: E/AndroidRuntime(16004): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 
    04-28 08:41:55.186: E/AndroidRuntime(16004): ... 11 more 
    04-28 08:46:55.255: I/Process(16004): Sending signal. PID: 16004 SIG: 9 
+0

您是否有權限訪問GPS? – Blackbelt 2013-04-28 09:32:21

+0

yes我使用了 user2292866 2013-04-28 09:37:22

+1

瞭解如何使用調試器,在這種情況下,確定錯誤的位置非常有用。的 – 2013-04-28 09:56:43

回答

0

這可以分爲兩部分來回答。

  • calling a background service every 10 mins, using alarm
  • 使用的LocationManager和LocationListener的,(或兩者)網絡和GPS提供商之間進行選擇。如果選擇網絡提供商,由於gps提供商花了很長時間來連接,我不需要gps的準確性。網絡提供商準確度高達250ms(我在5個小時內得到1個不好的樣本)。請記住LocationListener,在三星手機上不起作用(因爲三星手機有大量定製的Android版本,並且他們沒有做一個徹底的移植工作)。

OR

  • 我用力讓我現在的位置還挺調用God.locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)

除了上面的報警代碼,把下面的代碼在onHandleIntent

@Override 
final protected void onHandleIntent(Intent intent) { 
    mainContext = getApplicationContext() ; 
    Location myLocation; 
     if (God.locationManager == null) 
      God.locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 
     myLocation = God.locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
     if (myLocation != null) 
      onLocationChanged(myLocation); 
     else { 
      God.notifications.setSpeedNotification(); 
     } 
} 

注意:您可以選擇Locati onManager.GPS_PROVIDER,準備在露天(無雲)下進行測試,並在5分鐘左右與4-5顆衛星同步。

+0

準備好在多個手機上放入大量的Log調試語句並進行瘋狂調試。位置不容易順利工作。將需要時間和精力。 – Siddharth 2013-04-28 14:15:01