ãã¬ã€ã¹ããã«ãŒãŠã£ãžã§ãããšãªãŒãã³ã³ããªãŒãã³ã³ããŒãã³ãã¯ã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ã€ã®æ¹æ³ã®ããããã§è¿ãã®å Žæãéžæã§ããŸãã
- çŸåšã®å Žæãéžæãã -ãŠãŒã¶ãŒã¯ãèªåçã«éžæãããå Žæãèªåã«åããªãå Žåãç»é¢ã«è¡šç€ºãããå°å³ã移åããŠå Žæãéžæã§ããŸãã
- è¿ãã®å Žæã®éžæ -ãŠãŒã¶ãŒã¯ãçŸåšã®å Žæã®è¿ãã®å Žæã®ãªã¹ãããå Žæãéžæã§ããŸãããã®ãªã¹ãã¯ããããã®äžéšãããã©ãã°ããŠéãããšãã§ããŸãã
æãããªè³ªåã¯ããããã䜿çšããçç±ã¯äœã§ããïŒãã§ãã
- éçºæéã¯å€§å¹
ã«ççž®ãããŸã -ã³ã³ããŒãã³ãã¯ããã«äœ¿çšã§ããŸããã€ãŸãããã¹ãŠã®æ©èœïŒããããå Žæãã©ã€ããµã€ã¯ã«ããããã¯ãŒã¯èŠæ±ãªã©ïŒã¯ãŠã£ãžã§ããã«ãã£ãŠå®å
šã«å¶åŸ¡ãããŸãã ãããæåã§è¡ãæ¹æ³ã«æ¯ã¹ãŠãæéã倧å¹
ã«ççž®ãããŸãã
- äžè²«ãã䜿çšçµéš -ãã®ã³ã³ããŒãã³ããGoogleã ãã§ãªãããµãŒãããŒãã£ã®éçºè
ïŒããªãã®ãããªïŒã§ã䜿çšãããšããã®ã³ã³ããŒãã³ãã¯äœ¿ãæ
£ããŠããããããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãã¯ããã«ç°¡åã«ãªããŸãã
éçšããã»ã¹
ã ãããä»ãç§ãã¡ã¯äœãæ±ã£ãŠããããç¥ã£ãŠããŸãã Place Pickerã©ã€ããµã€ã¯ã«ã«ã¯åžžã«ååšããããã€ãã®éèŠãªæäœããããŸããããã«ã€ããŠã¯ãããããæ
£ã芪ããã§ãããŸãã
- startActivityForResultïŒïŒã¡ãœããã䜿çšããŠãã¬ãŒã¹ããã«ãŒãéããšãã¢ã¯ãã£ããã£ã«ãã£ãŠè¿ãããéžæãããã¬ãŒã¹ããã£ããããŸãã
- 次ã®ã¹ãããã¯ããããäžã®åæäœçœ®ã決å®ããããšã§ãã å Žæãäºåã«æäŸãããŠããå Žåã¯ããã䜿çšããŸãããã以å€ã®å Žåã¯ãããã€ã¹ã®çŸåšäœçœ®ãéžæãããŸãã
- ãŠãŒã¶ãŒãå°å³äžã®å Žæãéžæããããè¿ãã®å Žæã®ãªã¹ãããéžæããããéžæããã«å Žæã®éžæããŒã«ãéãããã
- éžæãå®äºãããšãå Žæã®éžæãå®äºããçµæïŒéžæããå ŽæïŒãã¢ã¯ãã£ããã£ã«è¿ãããŸãã
ãã¬ã€ã¹ããã«ãŒã®éçšããã»ã¹ å®è£
æåã«ã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);
äžã«ç€ºããããã«ãã¢ã¯ãã£ããã£ããè¿ããããšãã«éžæãã
ãã¬ã€ã¹ãååŸããŸãã 次ã®ããã«ããŸãã
Place selectedPlace = PlacePicker.getPlace(data, this);
ãã®æç¹ã§ããŠãŒã¶ãŒãå Žæãéžæããââã«
æ»ããã¿ã³ã䜿çšããŠããã«ãŒãŠã£ãžã§ãããçµäºãããšãçµæã¯è¿ãããŸããã
泚 ïŒ
Place PickerãŠã£ãžã§ããã䜿çšããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã«æ¬¡ã®æš©éãä»äžããå¿
èŠããããŸã
-ACCESS_FINE_LOCATION ã
ããŒã
ã¢ããªã±ãŒã·ã§ã³ã§1ã€ã®ãã¶ã€ã³ããŒããç¶æããããã«ãããã©ã«ãã§ã¯ãPlace PickerãŠã£ãžã§ããã¯ã¢ããªã±ãŒã·ã§ã³ã®è²ã䜿çšããŸãã
- colorPrimary-ã¢ããªã±ãŒã·ã§ã³ã®ã¢ã¯ã·ã§ã³ããŒã®ããã¹ããšæ»ãç¢å°ã®è²ãšããŠäœ¿çšãããŸã
- colorPrimaryDark-ã¢ã¯ã·ã§ã³ããŒã®èæ¯è²ãšããŠäœ¿çšãããŸã
泚æããŠãããŒãã®èšå®ãããè²å±æ§ãå確èªããŠãã ããã
ããŒã³ã³ä¿¡å·
ãã¬ã€ãµãŒãã¹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ã䜿çšããŠãããå®è£
ããããšã«ããŸããã
å®æããã¯ã©ã¹ãèŠãŠãã³ãŒããç解ããããšããå§ãããŸãã
- Places APIã䜿çšããŠãæäŸãããæ€çŽ¢ã¯ãšãªãšç·¯åºŠçµåºŠå¢çã«åºã¥ããŠäºæž¬ãªãŒãã³ã³ããªãŒããªã¹ããååŸãå§ããŠããŸãã
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ã§æäŸãããã³ã³ããŒãã³ãã§ããå€ãã®åé¡ã解決ã§ãããšèããŠããããè¡ãæ¹ãã¯ããã«ç°¡åã§ã ã»ãšãã©ã®æ¥åžžçãªã¿ã¹ã¯ã