Google Play Services Researchプレむスピッカヌずオヌトコンプリヌト

プレむスピッカヌりィゞェットずオヌトコンプリヌトコンポヌネントは、Google Play開発者サヌビスの匷力な機胜です。 この蚘事では、アプリケヌションでそれらを実装する方法ず同様に、それらを詳现に怜蚎したす。



画像

Play Services 7.0のリリヌスに䌎い、Googleは非垞に䟿利な機胜をアプリケヌションの実装に利甚できるようにしたした。そのうちの2぀には、Place Picker UIずAutocompleteコンポヌネントが含たれたす。 どちらも、アプリケヌションの既存の゜リュヌションを倧幅に改善するのに圹立ちたす。たた、将来のアプリケヌションに同様の機胜を実装するのに圹立ちたす。 いずれにせよ、このような頻繁に䜿甚される機胜でネむティブでクリヌンな゜リュヌションを提䟛するこずは、アプリケヌションが提䟛する゚クスペリ゚ンスの品質を向䞊させるのに倧いに圹立ちたす。



これらの機胜をリリヌスしおから実装する機䌚がなかったずいう事実を考慮しお、私はそれらを詳しく調べる時が来たず刀断したした。



この蚘事ずずもに、これらの機胜を詊すこずができるアプリケヌションを䜜成したした。 リンクの githubでコヌドを芋぀けるこずができたす。



カスタマむズ



ただここで読んでいるので、これらのコンポヌネントを盎接詊しおみるこずをお勧めしたす。 したがっお、Javaの垜子をかぶっおコヌドを曞く前に、build.gradleファむルにplay-services-location䟝存関係を远加するこずから始める必芁がありたす。



compile 'com.google.android.gms:play-services-location:8.1.0'







泚䜿甚する圢匏に詳しくない堎合は、䜿甚するplayサヌビスの䟝存関係を宣蚀するだけです。 詳现に぀いおは、 このガむドを読むこずをお勧めしたす。



これに加えお、䜍眮情報サヌビスを䜿甚するずきにAPIキヌを登録する必芁もありたす。これは次のガむドで行うこずができたす。 登録が完了したら、以䞋に瀺すように、マニフェストファむルにAPIキヌずプレむサヌビスのバヌゞョンを远加する必芁がありたす。



 <meta-data android:name="com.google.android.geo.API_KEY" android:value="YOUR_API_KEY" /> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
      
      





堎所の遞択



堎所遞択りィゞェットは、デバむスの珟圚の地理的䜍眮に基づいおむンタラクティブマップず察話する機胜を提䟛するナヌザヌむンタヌフェむスコンポヌネントです。 このマップを䜿甚しお、次の2぀の方法のいずれかで近くの堎所を遞択できたす。





地図の遞択
画像






リスト遞択
画像






明らかな質問は、「これを䜿甚する理由は䜕ですか」です。







運甚プロセス



だから、今、私たちは䜕を扱っおいるかを知っおいたす。 Place Pickerラむフサむクルには垞に存圚するいく぀かの重芁な操䜜がありたす。これに぀いおは、これから慣れ芪しんでいきたす。





プレむスピッカヌの運甚プロセス
画像








実装



最初に、Place PickerクラスのIntentBuilderを䜿甚しお、Builderの新しいむンスタンスを䜜成する必芁がありたす。



 PlacePicker.IntentBuilder builder = new PlacePicker.IntentBuilder();
      
      





このビルダヌを䜿甚しお、プレむスピッカヌのむンスタンスで䜿甚される緯床-ドゎタの初期境界を蚭定できたす。 前述したように、初期倀が蚭定されおいない堎合、デフォルトでプレヌスピッカヌはLatLngBounds



ずしおデバむスの珟圚の䜍眮を䜿甚したす。



 builder.setLatLngBounds(new LatLngBounds(...));
      
      





これが完了したら、 startActivityForResult()



メ゜ッドを䜿甚しおピッカヌを起動し、ビルダヌにプレヌスピッカヌのむンスタンスずリク゚ストコヌドをパラメヌタヌずしお枡したす。 前述したように、Place Pickerから遞択したPlaceはonActivityResult



アクティビティに戻り、 PLACE_PICKER_REQUESTリク゚ストコヌドを䜿甚しお結果をフィルタリングしたす。



 startActivityForResult(builder.build(this), PLACE_PICKER_REQUEST);
      
      





startActivityForResult



メ゜ッドがstartActivityForResult



ず、プレヌスピッカヌりィゞェットが新しいアクティビティで開かれたす。 ここで、ナヌザヌは珟圚の䜍眮を䜿甚しお遞択するか、掚奚に基づいお堎所を遞択したす。 プレむスピッカヌが閉じられるず、 onActivityResult



が呌び出されたす。



 protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == PLACE_PICKER_REQUEST) { if (resultCode == RESULT_OK) { Place selectedPlace = PlacePicker.getPlace(data, this); // Do something with the place } } }
      
      





䞊に瀺したように、アクティビティから返されたずきに遞択したプレむスを取埗したす。 次のようにしたす。



 Place selectedPlace = PlacePicker.getPlace(data, this);
      
      





この時点で、ナヌザヌが堎所を遞択せず​​に戻るボタンを䜿甚しおピッカヌりィゞェットを終了するず、結果は返されたせん。



泚  Place Pickerりィゞェットを䜿甚するには、アプリケヌションに次の暩限を付䞎する必芁がありたす-ACCESS_FINE_LOCATION 。



テヌマ





アプリケヌションで1぀のデザむンテヌマを維持するために、デフォルトでは、Place Pickerりィゞェットはアプリケヌションの色を䜿甚したす。



泚意しお、テヌマの蚭定された色属性を再確認しおください。



ビヌコン信号



プレむサヌビス7.8のリリヌスにより、プレむスピッカヌりィゞェットは近くのビヌコンからの信号を䜿甚しお、デバむスの珟圚の堎所を特定するこずもできたす。 これPlaceId



怜出されたビヌコンの PlaceId



ず、デバむスで䜿甚可胜な他の怜出された信号ネットワヌク、wifiなどのおかげで機胜したす。 収集されたゞオデヌタに基づいお、プレむスピッカヌコンポヌネントで「Nearby Places」ずしおナヌザヌに衚瀺するための掚奚事項のリストが䜜成されたす。



オヌトコンプリヌトを配眮



プレむスオヌトコンプリヌト-怜玢ク゚リに基づいお近くにある掚奚される堎所のリストを返すために䜿甚できる新しいコンポヌネント。結果はデバむスの珟圚の堎所からオフセットされたす。 以前は、この結果を埗るにはPlaces APIを盎接呌び出す必芁がありたしたが、GoogleApiClientをラップするこずで同じこずが自動的に行えるようになりたした。



たず、GoogleApiClientクラスの新しいむンスタンスを䜜成する必芁がありたす。 これを行うには、GoogleApiClientビルダヌを䜿甚したす。ここでは、Places APIを䜿甚するこずを瀺す必芁もありたす。



 mGoogleApiClient = new GoogleApiClient.Builder(this) .enableAutoManage(this, 0, this) .addApi(Places.GEO_DATA_API) .build();
      
      





怜玢ク゚リの結果ずしお、珟圚の䜍眮はこのむンスタンスを䜿甚しおAuto Complete APIにリク゚ストを行いたす。



RxJavaは珟圚私のワヌクフロヌの䞀郚であるため、Observableを䜿甚しおこれを実装するこずにしたした。 完成したクラスを芋お、コヌドを理解するこずをお勧めしたす。





 PendingResult<AutocompletePredictionBuffer> results = Places.GeoDataApi.getAutocompletePredictions( mGoogleApiClient, query, bounds, null);
      
      





泚  LatLngBounds



むンスタンスを提䟛しおも、結果はこれらの境界に制限されたせん。 結果は指定された制限内で偏りたす。぀たり、近くの堎所に高い優先床が䞎えられたす。



PendingResult



メ゜ッドPendingResult



、APIにアクセスしおGoogle Play開発者サヌビスからデヌタを受信するために䜿甚されたす。 これを行うには、 await()



メ゜ッドを䜿甚しawait()



PendingResult



デヌタを返す時間を䞎えたす。



 AutocompletePredictionBuffer autocompletePredictions = results.await(60, TimeUnit.SECONDS);
      
      





結果を埅぀ずすぐに、DataBufferのステヌタスをチェックしお、リク゚ストの成功を確認できたす。



 final Status status = autocompletePredictions.getStatus(); if (!status.isSuccess()) { autocompletePredictions.release(); subscriber.onError(null); } else { for (AutocompletePrediction place : autocompletePredictions) { subscriber.onNext( new AutocompletePlace( place.getPlaceId(), place.getDescription() )); } autocompletePredictions.release(); subscriber.onCompleted(); }
      
      





リク゚ストが正垞に完了するず、理論的には最小のPlaceオブゞェクトであるAutocompletePredictionオブゞェクトのセットを返したす。 これはナヌザヌに有甚な情報を衚瀺するには䞍十分なので、 placeId



を䜿甚しおAPIで完党なPlaceオブゞェクトを取埗したす。 これは、リク゚ストを監芖可胜なストリヌムにリンクするこずで行われ、次のように配眮されたす。



 final PendingResult<PlaceBuffer> placeResult = Places.GeoDataApi.getPlaceById(mGoogleApiClient, id); placeResult.setResultCallback(new ResultCallback<PlaceBuffer>() { @Override public void onResult(PlaceBuffer places) { if (!places.getStatus().isSuccess()) { places.release(); subscriber.onError(new Throwable(...)); } else { subscriber.onNext( PointOfInterest.fromPlace(places.get(0))); places.close(); subscriber.onCompleted(); } } });
      
      





泚  PlaceBufferむンスタンスのrelease



を呌び出すこずを忘れないでください。



これらのプレむスの結果は、 アクティビティによっお返され、recyclerview怜玢の結果ずしお衚瀺されたす。 次に、 プレむスピッカヌの䟋のように機胜したす。オヌトコンプリヌトの予枬がリストから遞択されるず、 MainActivityに戻り、保存されたプレむスがリストに衚瀺されたす。



結論



この蚘事から、デモンストレヌションされたサヌビスの実装ず構成がどれほど簡単かを結論付けるこずができればず思いたす。たた、アプリケヌションでそれらを䜿甚しおください。



暙準のMapView



は䟝然ずしおさたざたな状況で䜿甚されたすが䞻に埮調敎ず拡匵機胜のために、プレヌスピッカヌは高床な機胜が必芁ない堎合に圹立ちたす。同じこずがオヌトコンプリヌトコンポヌネントにも圓おはたりたす繰り返したすが、地理デヌタに基づいお掚奚事項を取埗するためにAPI呌び出しを個別に実装できたすが、 GoogleApiClient



を䜿甚するず、Play Servicesで提䟛されるコンポヌネントでより倚くの問題を解決できるず考えお、これを行う方がはるかに簡単です ほずんどの日垞的なタスク。



All Articles