web-dev-qa-db-ja.com

場所の検索:GooglePlay位置情報サービスまたはAndroidプラットフォームの場所API

新しいナビゲーションアプリのユーザーの場所を取得しようとしています。ユーザーの場所を頻繁に確認したいのですが、正確である必要があります。サンプルの次のコードを使用して場所を取得します。

public class MainActivity extends Activity implements LocationListener {
private LocationManager locationManager;
private String provider;
private TextView a;
private TextView b;

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    a = (TextView) findViewById(R.id.a);
    b = (TextView) findViewById(R.id.b);

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    Criteria criteria = new Criteria();
    provider = locationManager.getBestProvider(criteria, false);
    Location location = locationManager.getLastKnownLocation(provider);

    if (location != null) {
        System.out.println("Provider " + provider + " has been selected.");
        onLocationChanged(location);
    } else {
        a.setText("Location not available");
        b.setText("Location not available");
    }
}

@Override
protected void onResume() {
    super.onResume();
    locationManager.requestLocationUpdates(provider,0, 1, this);
}

@Override
protected void onPause() {
    super.onPause();
    locationManager.removeUpdates(this);
}

@Override
public void onLocationChanged(Location location) {
    Double lat =  location.getLatitude();
    Double lng =  location.getLongitude();
    a.setText(String.valueOf(lat));
    b.setText(String.valueOf(lng));
}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
    // TODO Auto-generated method stub

}

@Override
public void onProviderEnabled(String provider) {
    Toast.makeText(this, "Enabled new provider " + provider,
            Toast.LENGTH_SHORT).show();

}

@Override
public void onProviderDisabled(String provider) {
    Toast.makeText(this, "Disabled provider " + provider,
            Toast.LENGTH_SHORT).show();
}
}

しかし、私が移動しても場所の座標は更新されません、私は常に一定の値を取得します...場所を取得するためのより良い方法はありますか? Android docsによると、GooglePlayロケーションサービスまたはAndroidプラットフォームロケーションAPIを使用できます。両方のサンプルコードを確認し、LocationListenerを実装しています。ユーザーの場所を取得するためのインターフェイス。では、実際の違いは何ですか?

10

絶対に新しいグーグルプレイロケーションサービスを使用してください。彼らは古いロケーションマネージャーよりも屋内ではるかにうまく機能します。新しいGooglePlayの位置情報サービスを使用し、定期的にバックグラウンドで動作するサンプルを作成しました。見てみな:

https://github.com/nickfox/GpsTracker/tree/master/phoneClients/Android

23
nickfox

私がそれを扱っていたとき、私は2つの良い情報源に出くわしました:

  1. ブログ投稿: Android Location Fused ProviderFusedLocationProviderApi を使用してAndroidで位置情報を取得するための優れた完全なチュートリアルが含まれています。

  2. 次の回答 Android LocationClientクラスは非推奨ですが、ドキュメントで使用されています 質問。

基本的に、どちらもGoogle I/Oセッションで言及されているのと同様の手順について話します。そのリンクは、回答の1つに記載されています。

  • まず、次のようにGoogleClientApiインスタンスを取得します。

    _GoogleClientApi googleApiClient = new GoogleApiClient.Builder(locationActivity)
            .addApi(LocationServices.API)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build();
    _
  • 次に、次のように.connect()を呼び出します。

    _googleApiClient.connect();
    _
  • 次に、コールバックonConnectedで、最後の場所を取得するか、必要に応じて場所の更新をリクエストすることもできます。例:

    _LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
    _

    場所の更新をリクエストする場合は、 requestLocationUpdates 呼び出しを使用できます。

それが役に立てば幸い。

3
Shobhit Puri