任何人都可以向我解释GPS跟踪如何在Android中运行

时间:2015-01-28 17:17:27

标签: android gps

我正在寻找GPS坐标。我的标准是:

  1. 不等于最后一个位置

  2. 准确度< 500

  3. 一般而言,系统应接受<200m aprox的GPS坐标。

    我在我的应用中尝试了4次尝试:

    首先尝试:

    19.3820126,-99.1647096:Acc:50.528 Last location ( That's why we keep searching - error 3 km)
    01-29 10:37:42.698  onLocationChanged﹕ 19.364292,-99.1776019:Acc:660.0 (error: Aprox 60 m - should accept it)
    01-29 10:37:47.733  onLocationChanged﹕ 19.3639126,-99.1771124:Acc:660.0 (error: Aprox 80 m - should accept it)
    01-29 10:37:52.788  onLocationChanged﹕ 19.3639126,-99.1771124:Acc:660.0 (error: Aprox 80 m - should accept it)
    01-29 10:37:57.853  onLocationChanged﹕ 19.3820112,-99.1646983:Acc:50.531 (Last location - error 3km)... System get the wrong coord.
    

    第二次尝试:

    01-29 10:42:05.885  onLocationChanged﹕ 19.3652615,-99.1782989:Acc:784.0 (error: Aprox 100 m - should accept it)
    01-29 10:42:10.980  onLocationChanged﹕ 19.3652615,-99.1782989:Acc:784.0 (error: Aprox 100 m - should accept it)
    01-29 10:42:15.985  onLocationChanged﹕ 19.3652615,-99.1782989:Acc:784.0 (error: Aprox 100 m - should accept it)
    01-29 10:42:21.020  onLocationChanged﹕ 19.3652615,-99.1782989:Acc:784.0 (error: Aprox 100 m - should accept it)
    01-29 10:42:26.085  onLocationChanged﹕ 19.3652615,-99.1782989:Acc:784.0 (error: Aprox 100 m - How can onLocationChanged can be called if location is not changing)
    

    第三次尝试:

    01-29 10:47:20.002  onLocationChanged﹕ 19.3652615,-99.1782989:Acc:784.0 (Last location - error: Aprox 100 m)
    01-29 10:47:25.037  onLocationChanged﹕ 19.3820153,-99.1646946:Acc:50.532 (Last location - error 3km)... System get the wrong coord.
    

    第四次尝试:

    01-29 11:00:25.518  onLocationChanged﹕ 19.3651962,-99.1780395:Acc:639.0 (error: Aprox 100 m - should accept it)
    01-29 11:00:34.016  onLocationChanged﹕ 19.3651962,-99.1780395:Acc:639.0 (error: Aprox 100 m - should accept it)
    01-29 11:00:38.451  onLocationChanged﹕ 19.3651962,-99.1780395:Acc:639.0 (error: Aprox 100 m - should accept it)
    01-29 11:00:43.455  onLocationChanged﹕ 19.3651962,-99.1780395:Acc:639.0 (error: Aprox 100 m - should accept it)
    01-29 11:00:48.530  onLocationChanged﹕ 19.3651962,-99.1780395:Acc:639.0 (error: Aprox 100 m - should accept it)
    01-29 11:00:53.585  onLocationChanged﹕ 19.3651962,-99.1780395:Acc:639.0 Time's up, app doesn't accept the coord ( criteria is Acc < 500), but I could accept it.
    

    这四次尝试让我问了很多:

    1. 准确性是值得信赖的因素。我知道精度越小,效果越好。不过,我在这里发现相信准确性会给我带来错误的结果。

    2. 在第一次和第三次尝试中,为什么加入的坐标是另一个坐标(我的家,我在工作)

    3. 在第二次尝试中,为什么在坐标是相同的情况下调用onLocationChanged

    4. 我的代码很标准:

      public class LocationUtils implements
          GoogleApiClient.ConnectionCallbacks,
          GoogleApiClient.OnConnectionFailedListener, LocationListener {
      private static final long ONE_MIN = 1000 * 60;
      private Context ctx;
      // Debugging tag for the application
      public static final String APPTAG = "LocationSample";
      
      public static final int MILLISECONDS_PER_SECOND = 1000;
      
      // The update interval
      public static final int UPDATE_INTERVAL_IN_SECONDS = 5;
      
      // A fast interval ceiling
      public static final int FAST_CEILING_IN_SECONDS = 1;
      
      // Update interval in milliseconds
      public static final long UPDATE_INTERVAL_IN_MILLISECONDS =
              MILLISECONDS_PER_SECOND * UPDATE_INTERVAL_IN_SECONDS;
      
      // A fast ceiling of update intervals, used when the app is visible
      public static final long FAST_INTERVAL_CEILING_IN_MILLISECONDS =
              MILLISECONDS_PER_SECOND * FAST_CEILING_IN_SECONDS;
      public static final long FASTEST_INTERVAL_CEILING_IN_MILLISECONDS = 100; // 16ms = 60fps
      
      // Create an empty string for initializing strings
      public static final String EMPTY_STRING = new String();
      public static GoogleApiClient mGoogleApiClient;
      public static LocationRequest mLocationRequest;
      private int mAction;
      
      
      
      public LocationUtils(Context context) {
          ctx = context;
      }
      
      
      public static void disconnectGPS(LocationListener list) {
          if (mGoogleApiClient != null && mGoogleApiClient.isConnected()) {
              stopPeriodicUpdates(mGoogleApiClient, list);
              mGoogleApiClient.disconnect();
          }
      }
      
      public static void startPeriodicUpdates(GoogleApiClient mGoogleApiClient, LocationRequest mLocationRequest, LocationListener listener) {
          LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, listener);
      
      }
      
      public static void stopPeriodicUpdates(GoogleApiClient mGoogleApiClient, LocationListener listener) {
          LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, listener);
      }
      
      public void init_location(Context ctx) {
          mGoogleApiClient = new GoogleApiClient.Builder(ctx)
                  .addApi(LocationServices.API)
                  .addConnectionCallbacks(this)
                  .addOnConnectionFailedListener(this)
                  .build();
          mLocationRequest = LocationRequest.create();
      
          /*
           * Set the update interval
           */
          mLocationRequest
                  .setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);
      
          // Use high accuracy
          mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
      
          // Set the interval ceiling to one minute
          mLocationRequest
                  .setFastestInterval(FAST_INTERVAL_CEILING_IN_MILLISECONDS);
          mLocationRequest
                  .setFastestInterval(FASTEST_INTERVAL_CEILING_IN_MILLISECONDS);
      }
      
      
      public static boolean servicesAvailable(Context ctx) {
          int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(ctx);
      
          if (ConnectionResult.SUCCESS == resultCode) {
              return true;
          } else {
              GooglePlayServicesUtil.getErrorDialog(resultCode, (Activity) ctx, 0).show();
              return false;
          }
      }
      
      @Override
      public void onConnected(Bundle bundle) {
              startPeriodicUpdates(mGoogleApiClient,mLocationRequest, this);
      }
      
      @Override
      public void onConnectionSuspended(int i) {
      
      }
      
      @Override
      public void onLocationChanged(Location location) {
          Log.e("onLocationChanged",location.getLatitude()+","+location.getLongitude()+":Acc:"+location.getAccuracy() );
      }
      
      @Override
      public void onConnectionFailed(ConnectionResult connectionResult) {
      
      }
      
      public void connect(int action) {
          mAction = action;
          if (!mGoogleApiClient.isConnected()) {
              mGoogleApiClient.connect();
              }
      
      
          }
      }
      

      我正在使用多种设备进行测试,三星s4,s3 mini,核心2。 我总是打开GPS,没有wifi,但3G已激活。

      编辑: 我在室内进行测试,因此GPS结果不应该很好,但我希望Fused Location能够适应我的情况,因为我无法再选择提供商。

2 个答案:

答案 0 :(得分:1)

您的位置在半径范围内的准确率仅为68%,因此仍有很大可能不正确。

没有WiFi你的意思是你没有连接到任何网络或WiFi被禁用?

例如,如果您在一个地方安装了WiFi路由器,然后移动到一个新的地方并随身携带WiFi路由器,Google仍会在相当长一段时间内返回旧位置。

关于你的上一个问题,你要求每5秒更新一次位置,这样即使位置相同,你也会得到指定时间段的回调。

答案 1 :(得分:-1)

重复的问题? How accurate is Android GPS?

但是,如果您希望确定某些位置,取决于您要完成的任何操作,请查看地理围栏。

http://appcrawlr.com/android-apps/best-apps-geo-fencing

相关问题