Androidでジオフェンスを操作します。 更新する

少し前に、私は地図上のユーザーの位置の変化を判断することを任されました。 記事の実験結果によると、Googleサービスジオフェンスは、精度とエネルギー効率の点で、これらの目的に最適です。


画像


ジオフェンスの使用方法は、ハブに関する記事ロケーションAPIを使用するロシア語の例で詳細に説明されていますが、それから2年が経過し、情報は非常に古くなっています。


残念ながら、 GitHubでの著者の例はコンパイルすらできなかったので、ライブラリの最新バージョンで取得することにしました。 驚いたことに、 com.google.android.gms:play-services:4.0.30com.google.android.gms:play-services:8.4.0間でAPIに多くの変更がありました。 実際には、それらは記事でさらに議論されます。


コード

githubの例を更新しました(執筆時点で、元の例の作成者はプルリクエストを受け入れませんでした)。


それで、違いは何ですか?


手始めに、 オリジナルを読むことをお勧めします。


コンセプト自体は何も変わっていません。責任あるクラスだけが変わっています。
そのため、 LocationClient代わりにapi.GoogleApiClientGooglePlayServicesClientからのコールバックもapi.GoogleApiClientに移動し、 new LocationClient(this, this, this)代わりに便利なビルダーが登場しました。


  new GoogleApiClient.Builder(this) .addApi(LocationServices.API) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .build(); 

重要な違いは、 mGoogleApiClientmGoogleApiClient直接追加または削除するのではなく、 LocationServices.GeofencingApi介して削除することです。


  GeofencingRequest build = ... LocationServices.GeofencingApi.addGeofences(mGoogleApiClient, builder.build(), getPendingIntent()) .setResultCallback(new ResultCallback<Status>() { @Override public void onResult(@NonNull Status status) { if (status.isSuccess()) { String msg = "Geofences added: " + status.getStatusMessage(); Log.e("GEO", msg); Toast.makeText(GeofencingService.this, msg, Toast.LENGTH_SHORT) .show(); } GeofencingService.this.onResult(status); } }); 

最初のパラメーターも変更されました。ジオフェンスのリストの代わりに、特別なビルダーから取得できるGeofencingRequestが渡されます。


  GeofencingRequest.Builder builder = new GeofencingRequest.Builder(); builder.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER); builder.addGeofences(mGeofenceListsToAdd); GeofencingRequest build = builder.build(); 

新しいビルダーの機能の1つは、追加時のジオフェンスの動作を制御することです。 たとえば、元の記事のコメントで、インストール時にデバイスがゾーン外にある場合にExit geofenceトリガーがExit geofenceする可能性について尋ねました。 これを行うには、デフォルトでGeofencingRequest.INITIAL_TRIGGER_ENTERおよびGeofencingRequest.INITIAL_TRIGGER_DWELLフラグを使用して、 setInitialTrigger (int initialTrigger)メソッドを介してGeofencingRequest.INITIAL_TRIGGER_EXITフラグを渡すことでこれを実行できます。 フラグは互いに組み合わせることができます。


さらに、最後のコールバックパラメーターが削除され、 LocationServices.GeofencingApi.addGeofencesPendingResultPendingResult返すようになりました。これは、 setResultCallback(..)メソッドのコールバックを使用して、ストリームのブロック、結果の待機、または応答の非同期受信に使用できます。 いずれにせよ、結果はジオフェンスの追加/削除操作のステータスになります。 このコールバックは、元の記事のOnAddGeofencesResultListenerまたはonRemoveGeofencesByRequestIdsResultを置き換えます。


次の方法で不要なジオフェンスを削除できます。


  LocationServices.GeofencingApi.removeGeofences(mGoogleApiClient, /*PendingIntent   id */) 

ReceiveTransitionsIntentServiceの変更


以前は、 LocationClientクラスの静的メソッドを使用してジオフェンスでトリガーをトリガーした結果を処理し、 Intentがパラメーターとして入力されましたが、現在はGeofencingEventが同じジョブを実行するための同じメソッドを持っています。 次のようにして取得できます。


 GeofencingEvent geofencingEvent = GeofencingEvent.fromIntent(intent); 

ジオフェンス自体の作成は変更されず、Geofence.Builderを介してGeofence.Builderます。


もう1つのイノベーションは、トリガーがトリガーされた後、ジオフェンスが自動的に削除されるため、それらを自分で削除する必要がないということです。


また、サンプルコードでは、終了するトリガーを備えたジオフェンスを配置する別のボタンを追加しました。


ジオフェンスを操作するためのいくつかのヒント



参照:




Source: https://habr.com/ru/post/J282129/


All Articles