黒子の観察者

テクノロジーやビジネス、音楽について書くブログです。

Googleがアプリでオートコンプリート機能を提供開始!場所や住所の検索が簡単に

Goolgeは、米国にて2015年12月17日より、アプリ内でユーザーが場所や住所を素早く入力できる機能を提供開始したと発表しました。この機能は、ユーザーが場所の地名や名前、住所を入力している途中で、自動的に補完するオートコンプリート機能であり、2つの方法で提供しています。

そもそもオートコンプリートとは

まずそもそもオートコンプリートとは何か、ですが検索キーワードを入力した際に出てくる予測キーワードの表示機能のことです。

検索ボックスに入力すると、入力しているキーワードと似ている予測キーワードが表示されるので、すばやく情報を見つけることができます。たとえば、「ニューヨーク」と入力するにつれて、ニューヨークに関連する他の検索キーワードが表示される場合があります。

オートコンプリート - ウェブ検索 ヘルプ

オートコンプリート ウィジェットとは

Googleが今回発表したオートコンプリート ウィジェットのUIには、オーバーレイとフルスクリーンの2つのタイプがあります。

オーバーレイタイプのオートコンプリート ウィジェット

f:id:blackwatcher:20151229150457g:plain

 フルスクリーンタイプのオートコンプリート ウィジェット

f:id:blackwatcher:20151229150606g:plain

Andoridでは、オートコンプリート ウィジェットは画面制御の動作のため、フラグメントとして追加することで実装可能となっています。イベントリスナーを追加し、オートコンプリートされたプレイスのリファレンスをアプリケーションで受け取る仕様です。

アクティビティのXMLレイアウトファイルにフラグメントを追加する方法:

<fragment
  android:id="@+id/place_autocomplete_fragment"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
android:name="com.google.android.gms.location.places.ui.PlaceAutocompleteFragment"
  />

 オートコンプリート ウィジェットインテントで起動するこもできます。インテントについて、詳しくはこちらをご確認ください。

Intent | Android Developers

なぜアプリのオートコンプリートを強化したのか

今回なぜGoolgeはアプリ内での場所や住所の検索機能を強化したのでしょうか?それは、ユーザー体験の向上を目的としたものであると思います。最近AMPプロジェクトなど、モバイル上での体験を高速化させ、ユーザー体験を向上させる試みが数多く実施されています。

AMP Project · GitHub

この動きはGoolgeに限らず、Facebookなどほかの競合企業も同様です。Facebookで言えば、Instant Articleというニュース記事をFacebookアプリ内で閲覧できるサービスを展開中です。あらゆる企業が、モバイルでの高速化を目指してさまざまな施策を打っているのです。

Instant Articles | Facebook

実装方法まとめ

ここからは、実際にプログラムで上記のオートコンプリートを実装する方法を見ていきます。

まず、アクティビティのonCreate()メソッドにイベントリスナーを追加する方法:

// 
PlaceAutocompleteFragment fragment = (PlaceAutocompleteFragment)
    getFragmentManager().findFragmentById(R.id.place_autocomplete_fragment);

fragment.setOnPlaceSelectedListener(new PlaceSelectionListener() {
   @Override
   public void onPlaceSelected(Place place) { // 選択したプレイスを処理
   }
   @Override
   public void onError(Status status) { // エラーを処理
   }

オートコンプリート ウィジェットを起動するインテントを作成する方法:

try {
   Intent intent =
            new PlaceAutocomplete.IntentBuilder(PlaceAutocomplete.MODE_FULLSCREEN)
           .build(this);
   startActivityForResult(intent, PLACE_AUTOCOMPLETE_REQUEST_CODE);
} catch (GooglePlayServicesRepairableException e) {
   GooglePlayServicesUtil
           .getErrorDialog(e.getConnectionStatusCode(), getActivity(), 0);
} catch (GooglePlayServicesNotAvailableException e) {
   // 例外を処理
}

iOSObjective-C)では、オートコンプリートのデリゲートを実装してプレイス選択に対応します。

@interface MyViewController () 
@end

@implementation ViewController
.
.
.
- (IBAction)onLaunchClicked:(id)sender {
  // ボタン押下時にオートコンプリート ビュー コントローラーを表示
  GMSAutocompleteViewController *acController = [[GMSAutocompleteViewController alloc] init];
  acController.delegate = self;
  [self presentViewController:acController animated:YES completion:nil];
}

- (void)viewController:(GMSAutocompleteViewController *)viewController
    didAutocompleteWithPlace:(GMSPlace *)place {
  // ユーザーがプレイスを選択
  [self dismissViewControllerAnimated:YES completion:nil];
}

- (void)viewController:(GMSAutocompleteViewController *)viewController
    didAutocompleteWithError:(NSError *)error {
  [self dismissViewControllerAnimated:YES completion:nil];
}

// ユーザーがキャンセル ボタンを押下
- (void)wasCancelled:(GMSAutocompleteViewController *)viewController {
  [self dismissViewControllerAnimated:YES completion:nil];
}

@end

Swift の場合:

import UIKit
import GoogleMaps

class MyViewController: UIViewController {
    
    @IBAction func onLaunchClicked(sender: AnyObject) {
        let acController = GMSAutocompleteViewController()
        acController.delegate = self
        self.presentViewController(acController, animated: true, completion: nil)
    }
}

extension MyViewController: GMSAutocompleteViewControllerDelegate {
    
    func viewController(viewController: GMSAutocompleteViewController!, didAutocompleteWithPlace place: GMSPlace!) {
        // ユーザーがプレイスを選択
        self.dismissViewControllerAnimated(true, completion: nil)
    }
    
    func viewController(viewController: GMSAutocompleteViewController!, didAutocompleteWithError error: NSError!) {
        self.dismissViewControllerAnimated(true, completion: nil)
    }
    
    func wasCancelled(viewController: GMSAutocompleteViewController!) {
        self.dismissViewControllerAnimated(true, completion: nil)
    }
}

Place Pickerにもオートコンプリート機能が

今回の目的として、場所名や住所、地図上の位置など、ユーザーの現在地を知らせるのに便利なUIウィジェットPlace Pickerにもオートコンプリート機能が実装されています。ユーザーは場所名や住所の一部を入力するだけで、目的の場所を素早く選択できるメリットがあります。

ちなみに、すでにアプリでPlace Pickerを利用している場合は、移動的にオートコンプリート機能が実装されるとのことです。開発者は何も対応する必要がありません。

f:id:blackwatcher:20151229150641g:plain 

モバイルアプリで場所や住所の入力を容易にするオートコンプリートウィジェットをリリース - Google Developers Japan