2016-06-30 5 views
0

にわたって変動し、私が使用するAPIのいくつかは、私が戻ってくるまでに廃止予定ます。
GPS APIの変更が最も顕著です。私を混乱させるのは、古いAPIがはるかに優れた結果を出すように見えることです(コードは続く)。
私はMapViewのを使用し、また古い方法(別々のGPS &ネットワークprovders)と新しい方法(「FusedLocation」)と、プログラムのGPS COORDSを取得しています。
IがGoogleマップで両方のコードの座標を比較し、古いコード(seperatly GPS &ネットワークプロバイダを使用して)は、正確で安定であるが、( 『FusedLocation』を使用して)新しいコードは、定常数hunderedメートルオフでありませんmapViewが指し示す場所に一致します(つまり、それらが正確でなく、変化し続けることを意味します)。GPSの結果は古いものと新しいAPI

私の質問はです。どちらの方法が正しいですか? FusedLocationを間違ってコーディングしているかもしれないと思っていたかもしれませんが、MapViewと一致しているので、私はこれを却下しました。 GPSを使用して

古いコードは、seperatly &ネットワーク:

public Location getLocation() { 
    locationManager = (LocationManager) context.getSystemService(LOCATION_SERVICE); 
    isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 
    isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 
     if(!isGPSEnabled && !isNetworkEnabled) { 

     } else { 
      this.canGetLocation = true; 
      if (isGPSEnabled) { 
       locationManager.requestLocationUpdates(
         LocationManager.GPS_PROVIDER, 
         MIN_TIME_BW_UPDATES, 
         MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
       if (locationManager != null) { 
        location = locationManager 
          .getLastKnownLocation(LocationManager.GPS_PROVIDER); 

       } 
      } 
       if(isNetworkEnabled) { 
       if(location == null) { 
        locationManager.requestLocationUpdates(
          LocationManager.NETWORK_PROVIDER, 
          MIN_TIME_BW_UPDATES, 
          MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
        if(locationManager != null) { 
         location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
        } 
       } 
      } 
     } 


新しいコード、FusedLocationを使用して:

protected synchronized void buildGoogleApiClient() { 
    mGoogleApiClient = new GoogleApiClient.Builder(context) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(LocationServices.API) 
      .build(); 
} 

public boolean canGetLocation() { 
    boolean isGPSEnabled = false; 
    boolean isNetworkEnabled = false; 
    try { 
     LocationManager lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); 
     isGPSEnabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER); 
     isNetworkEnabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return false; 
    } 
//some more code 
} 

public void onConnected(Bundle bundle) { 
    mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 

} 
+0

* * ...何のため?正確な位置を得るために?それらのうちのどれか...あなたはリスナーをセットアップし、プロバイダの修正を待つべきです... androidhiveのもう一つの "素晴らしい"コードのようです。 – Selvin

+0

haha​​ha androidhive rules 'locationManager.requestLocationUpdates(...); if(locationManager!= null){...} 'あなたが一度メソッドを呼び出した直後に、' locationManager'がnullであるかどうかを確認するポイントは何ですか?あまりにも遅いです...もし 'locationManager'がNPEの前にNPE行を取得するのであれば、 – Selvin

+0

のコードを嘲笑するのではなく、もっと古いコーディングサンプルを参照することができますか?それが実際より正確である理由を理解するのを手助けしようとしていますか? –

答えて

0

あなたは新しいAPIを使用する必要があり、FusedLocationProviderAPIは、高精度、低を含みバッテリの使用量とメモリの使用量が少なくなります。しかし、android.locationは現在廃止されています。詳細は

チェックこのdocを - ?使用するための正しいものである方法https://developers.google.com/android/reference/com/google/android/gms/location/FusedLocationProviderApi

+0

ありがとうございます。ご覧のとおり、FusedLocation(第2コードのチェック)を使用しています。何か案は? –

+0

私はあなたがFusedLocationを使用していることを知っています。私はちょうどあなたの質問に答えています "どちらの方法が正しい方法ですか?"回答に記載されているドキュメントを確認してください。 –

+0

ありがとう、申し訳ありませんが、あなたは実際に助けようとしました。なぜ私は悪い結果を得ているのか再度見てみようと思います。 –

関連する問題