2013-04-28 23 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