Google Play Servicesを使用してユーザーを見つける

こんにちは、友達!



デバイスの最大数でユーザーの位置を特定するという質問は、約6か月間苦しみました。 ここここに記載さている自転車にさえ来ました。 事実は、不明な理由で場所が特定されていないデバイスがあったことですが、他のアプリケーションは非常にうまく機能しました。 もう一度、コードを掘り下げ、不足しているものとまだ試したことのない実装を探してin音の広大さを調べてみたところ、新鮮なグーグルマニュアルの記事に出会いました。



この記事では、自分の目的でこれをどのように使用したかを説明し、簡単な例を示します。

ソースが欲しい




公式の例では、これらすべてを1つのアクティビティで行う方法を示しています。機能のみを表示することが重要であり、利便性が必要だったため、すべてを別のクラスに入れました。



開始するには、 LocationClientクラスとLocationRequestクラスのインスタンスを初期化する必要があります。 1つ目はロケーションAPIとGeofenceの基本メソッドへのアクセスを担当し、2つ目はLocationClientにサービスを提供し、更新を担当します。つまり、コールバックはそれを介して行われます。 次の例のように、LocationRequestを使用して、更新間隔、測位精度の優先順位、および更新間隔を設定できます。



private LocationRequest mLocationRequest; private LocationClient mLocationClient; private LocationListenerGPServices(final Context context) { mLocationRequest = LocationRequest.create(); mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS); mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); mLocationRequest.setFastestInterval(FAST_INTERVAL_CEILING_IN_MILLISECONDS); mLocationClient = new LocationClient(context, this, this); }
      
      







次に、2つのシナリオがあります。最後の既知の場所を取得するか、新しい場所の検索を要求することができます。

私の場合、これらの2つのオプションを組み合わせます。つまり、最初に最後の既知の場所を取得し、適切な場合はそれを使用します。それ以外の場合は更新を要求します。 以下のコードでは、 mLocationClient.connect()メソッドを呼び出した後、 onConnected(最終バンドルバンドル)メソッドがGooglePlayServicesClient.ConnectionCallbacksインターフェースで動作するはずです。つまり、Google Play Servicesに接続できたということです。 これで、場所の更新にサインアップできます。



 public void enableMyLocation() { log("enableMyLocation"); mLocation = null; mLocationClient.connect(); } private boolean useCurrentLocation() { final Location location = mLocationClient.getLastLocation(); if (System.currentTimeMillis() - location.getTime() < HALF_MINUTE) { log("useCurrentLocation"); disableMyLocation(); if (locationRunnable != null) locationRunnable.locationUpdate(location); return true; } return false; }
      
      







UIストリームをロードせずに時間を渡す場所を要求すると、AsynkTaskを一定時間動作するタイムアウトとして使用し、完了時に場所をアプリケーションに返し、場所の更新からサブスクライブされません。



  @Override public void onConnected(final Bundle bundle) { if (!useCurrentLocation()) { mLocationClient.requestLocationUpdates(mLocationRequest, this); if (findLocation != null && !findLocation.isCancelled()) findLocation.cancel(true); findLocation = new FindLocation(); findLocation.execute(); } } private Location endFind() { long sec = System.currentTimeMillis(); while (this.mLocation == null && System.currentTimeMillis() - sec < TIME_OUT) {} return this.mLocation; } private class FindLocation extends AsyncTask<Void, Void, Location> { @Override protected Location doInBackground(final Void... params) {return endFind();} @Override protected void onPostExecute(final Location location) { if (locationRunnable != null) locationRunnable.locationUpdate(location); disableMyLocation(); } } @Override public void disableMyLocation() { if (mLocationClient.isConnected()) mLocationClient.removeLocationUpdates(this); mLocationClient.disconnect(); } public interface LocationRunnable { public void locationUpdate(Location location);}
      
      







実際にこの例をgithubで使用する方法:

最初に、クラスのインスタンスを取得する必要があります。私にとっては、私にとってはシングルトーンを実装しました。

 locationListener = LocationListenerGPServices.getInstance(this);
      
      





次に、場所にサインアップして、あなたがそれでやりたいことをしてください。

 locationListener.setLocationRunnable(new ILocationListener.LocationRunnable() { @Override public void locationUpdate(final Location location) {}});
      
      







実際、このトピックについて伝えたかったのはそれだけです。 それから私は簡単に伝えようとし、テキストの最小限のコードを与えました。githubのソースで、ユーザーの位置を見つけ、ユーザーまでの距離で地下鉄駅のリストをソートする方法の例を示しました。



ご清聴ありがとうございました。これが誰かを助け、苦痛からあなたを救うことを願っています。



All Articles