新しい Places SDK クライアントへの移行

このガイドでは、プレイス アカウント間の変更について説明します。 互換性ライブラリと、新しいスタンドアロン バージョンの Places SDK for Android。 Google Cloud に移行せずに、プレイス互換性ライブラリを使用している場合 新しいスタンドアロン バージョンの Places SDK for Android。このガイドでは、 で、Places SDK for Android の新しいバージョンを使用できるようにプロジェクトを更新しましょう。

Places SDK for Android の機能とバグの修正を利用する唯一の方法 Places SDK for Android を使用することになります。 Google では、互換性ライブラリを新しいものに更新することをおすすめしています。 Places SDK for Android バージョンをリリースする予定です。

変更内容

主な変更は次のとおりです。

  • 新バージョンの Places SDK for Android を 使用できます。2019 年 1 月より前は、Places SDK for Android、 が Google Play 開発者サービスを通じて公開されました。それ以来、プレイスは 互換性ライブラリが提供されており、新しい Places SDK for Android。
  • まったく新しいメソッドを利用できます。
  • 場所を返すメソッドでフィールド マスクがサポートされるようになりました 表示されます。フィールド マスクを使用すると、表示する場所データのタイプを指定できます。 戻ります。
  • エラーの報告に使用するステータス コードが改善されました。
  • 予測入力でセッション トークンがサポートされるようになりました。
  • Place Picker はご利用いただけなくなりました

プレイス互換性ライブラリについて

2019 年 1 月に、スタンドアロンの Places SDK for Android バージョン 1.0 がリリースされ、 Google は移行に役立つ互換性ライブラリを提供 Places SDK for Android の廃止された Google Play 開発者サービス バージョンから (com.google.android.gms:play-services-places)。

この互換性ライブラリは、リダイレクトと翻訳のために一時的に提供されたものです 新しいスタンドアロンの API 呼び出しへの Google Play 開発者サービス バージョンに対する呼び出し 新しい名前を使用するようにコードを移行できるようになるまで、 使用できます。Places SDK for Android のバージョンごとに、 は、バージョン 1.0 からバージョン 2.6.0 まででリリースされています。 同等の機能を提供するため、プレイス互換性ライブラリがリリースされました。 説明します。

プレイス互換性ライブラリの凍結とサポート終了

Places SDK for Android の互換性ライブラリの全バージョン は 2022 年 3 月 31 日に非推奨となりますバージョン 2.6.0 は、 プレイス互換性ライブラリ。プレイスの機能とバグ修正にアクセスする唯一の方法 バージョン 2.6.0 以降の Android 向け SDK では、Places SDK for Android が使用されます。

Places SDK for Android に移行することをおすすめします。 をアップデートする必要がございます。 現在互換性ライブラリを使用している場合は、 移行する Places SDK for Android をインストールする Places SDK for Android に統合します

クライアント ライブラリをインストールする

新バージョンの Places SDK for Android は、 静的クライアント ライブラリです。

Maven を使用して、 Places SDK for Android を Android Studio プロジェクトに追加します。

  1. プレイス互換性ライブラリを現在ご使用の場合:

    1. dependencies セクションの次の行を置き換えます。

          implementation 'com.google.android.libraries.places:places-compat:X.Y.Z'

      次の行を使用して、Places SDK for Android に切り替えます。

          implementation 'com.google.android.libraries.places:places:3.3.0'

  2. 現在、Places SDK for Android の Play 開発者サービス バージョンを使用している場合:

    1. dependencies セクションの次の行を置き換えます。

          implementation 'com.google.android.gms:play-services-places:X.Y.Z'

      次の行を使用して、Places SDK for Android に切り替えます。

          implementation 'com.google.android.libraries.places:places:3.3.0'

  3. Gradle プロジェクトを同期します。

  4. アプリ プロジェクトの minSdkVersion16 以上に設定します。

  5. 「Powered by Google」を更新するアセット:

    @drawable/powered_by_google_light // OLD
    @drawable/places_powered_by_google_light // NEW
    @drawable/powered_by_google_dark // OLD
    @drawable/places_powered_by_google_dark // NEW
    
  6. アプリをビルドします。terraform plan または terraform apply への変換により Places SDK for Android の詳細については、以下のセクションをご覧ください。 エラーの解決に重点を置いています

新しい Places SDK クライアントを初期化する

次の例に示すように、新しい Places SDK クライアントを初期化します。

// Add an import statement for the client library.
import com.google.android.libraries.places.api.Places;

...

// Initialize Places.
Places.initialize(getApplicationContext(), apiKey);

// Create a new Places client instance.
PlacesClient placesClient = Places.createClient(this);

ステータス コード

QPS 上限エラーのステータス コードが変更されました。QPS 上限エラーが PlaceStatusCodes.OVER_QUERY_LIMIT から返されます。QPD の上限はこれ以上ありません。

以下のステータス コードが追加されました。

  • REQUEST_DENIED - リクエストが拒否されたことを示します。これには次の理由が考えられます。

    • API キーが指定されていません。
    • 無効な API キーが提供されました。
    • Cloud コンソールで Places API が有効になっていません。
    • 誤ったキー制限が指定された API キーが提供されました。
  • INVALID_REQUEST - リクエストがないか無効であるため、無効です。 渡します。

  • NOT_FOUND - 指定されたリクエストの結果が見つからなかったことを示します。

新しいメソッド

新バージョンの Places SDK for Android では、 複数のメソッドがあります。すべての新しいメソッド 以下を遵守する必要があります。

  • エンドポイントでは get 動詞を使用しなくなりました。
  • リクエスト オブジェクトとレスポンス オブジェクトは、対応するオブジェクトと同じ名前を共有します。 クライアント メソッドで確認できます。
  • リクエスト オブジェクトにビルダーが追加されました。必要なパラメータがリクエストとして渡される ビルダー パラメータ。
  • バッファは使用されなくなりました。

このセクションでは、新しいメソッドとその仕組みを紹介します。

ID で場所を取得する

fetchPlace() を使用する 特定の場所の詳細情報を取得できますfetchPlace() は以下と同様に機能します。 getPlaceById()

場所を取得する手順は次のとおりです。

  1. fetchPlace() を呼び出し、場所を指定する FetchPlaceRequest オブジェクトを渡します。 返されるプレイスデータを指定するフィールドのリストと ID です。

    // Define a Place ID.
    String placeId = "INSERT_PLACE_ID_HERE";
    
    // Specify the fields to return.
    List<Place.Field> placeFields = Arrays.asList(Place.Field.ID, Place.Field.NAME);
    
    // Construct a request object, passing the place ID and fields array.
    FetchPlaceRequest request = FetchPlaceRequest.builder(placeId, placeFields)
            .build();
    
    
  2. addOnSuccessListener() を呼び出して FetchPlaceResponse を処理します。単一の Place の結果が返されます。

    // Add a listener to handle the response.
    placesClient.fetchPlace(request).addOnSuccessListener((response) -> {
      Place place = response.getPlace();
      Log.i(TAG, "Place found: " + place.getName());
    }).addOnFailureListener((exception) -> {
        if (exception instanceof ApiException) {
            ApiException apiException = (ApiException) exception;
            int statusCode = apiException.getStatusCode();
            // Handle error with given status code.
            Log.e(TAG, "Place not found: " + exception.getMessage());
        }
    });
    

場所の写真を取得する

fetchPhoto() を使用する 場所の写真を取得します。fetchPhoto() は場所の写真を返します。パターン プロセスを簡素化しました。PhotoMetadata をリクエストできるようになりました Place オブジェクトから直接取得します。個別のリクエストは不要です 写真の幅または高さは最大 1,600 ピクセルです。fetchPhoto() 関数 getPhoto() と同様です。

場所の写真を取得する手順は次のとおりです。

  1. fetchPlace() への呼び出しを設定します。必ず リクエストの PHOTO_METADATAS フィールドは次のとおりです。

    List<Place.Field> fields = Arrays.asList(Place.Field.PHOTO_METADATAS);
    
  2. プレイス オブジェクトを取得します(この例では fetchPlace() を使用していますが、 findCurrentPlace()):

    FetchPlaceRequest placeRequest = FetchPlaceRequest.builder(placeId, fields).build();
    
  3. OnSuccessListener を追加して、結果の FetchPlaceResponsePlace を指定し、結果として得られる写真のメタデータを使用して、 ビットマップと帰属表示テキストを取得します。

    placesClient.fetchPlace(placeRequest).addOnSuccessListener((response) -> {
        Place place = response.getPlace();
    
        // Get the photo metadata.
        PhotoMetadata photoMetadata = place.getPhotoMetadatas().get(0);
    
        // Get the attribution text.
        String attributions = photoMetadata.getAttributions();
    
        // Create a FetchPhotoRequest.
        FetchPhotoRequest photoRequest = FetchPhotoRequest.builder(photoMetadata)
                .setMaxWidth(500) // Optional.
                .setMaxHeight(300) // Optional.
                .build();
        placesClient.fetchPhoto(photoRequest).addOnSuccessListener((fetchPhotoResponse) -> {
            Bitmap bitmap = fetchPhotoResponse.getBitmap();
            imageView.setImageBitmap(bitmap);
        }).addOnFailureListener((exception) -> {
            if (exception instanceof ApiException) {
                ApiException apiException = (ApiException) exception;
                int statusCode = apiException.getStatusCode();
                // Handle error with given status code.
                Log.e(TAG, "Place not found: " + exception.getMessage());
            }
        });
    });
    

ユーザーの現在地から場所を検索する

findCurrentPlace() を使用する ユーザーのデバイスの現在地を確認できます。findCurrentPlace() ユーザーのデバイスが配置されている場所を示す PlaceLikelihood のリストを返します。 特定される可能性が最も高いためですfindCurrentPlace() は以下と同様に機能します。 getCurrentPlace()

ユーザーのデバイスの現在地を取得する手順は次のとおりです。

  1. アプリが ACCESS_FINE_LOCATION をリクエストしていることを確認し、 ACCESS_WIFI_STATE 権限。ユーザーは、各自の設定内容に デバイスの位置情報を表示しますApp をリクエストする 権限 表示されます。

  2. FindCurrentPlaceRequest を作成します。これには、以下の場所データタイプのリストが含まれます。 戻ります。

      // Use fields to define the data types to return.
      List<Place.Field> placeFields = Arrays.asList(Place.Field.NAME);
    
      // Use the builder to create a FindCurrentPlaceRequest.
      FindCurrentPlaceRequest request =
              FindCurrentPlaceRequest.builder(placeFields).build();
    
  3. findCurrentPlace を呼び出してレスポンスを処理し、まず ユーザーがデバイスの位置情報を使用する許可を与えている。

      // Call findCurrentPlace and handle the response (first check that the user has granted permission).
      if (ContextCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
          placesClient.findCurrentPlace(request).addOnSuccessListener(((response) -> {
              for (PlaceLikelihood placeLikelihood : response.getPlaceLikelihoods()) {
                  Log.i(TAG, String.format("Place '%s' has likelihood: %f",
                          placeLikelihood.getPlace().getName(),
                          placeLikelihood.getLikelihood()));
                  textView.append(String.format("Place '%s' has likelihood: %f\n",
                          placeLikelihood.getPlace().getName(),
                          placeLikelihood.getLikelihood()));
              }
          })).addOnFailureListener((exception) -> {
              if (exception instanceof ApiException) {
                  ApiException apiException = (ApiException) exception;
                  Log.e(TAG, "Place not found: " + apiException.getStatusCode());
              }
          });
      } else {
          // A local method to request required permissions;
          // See https://developer.android.com/training/permissions/requesting
          getLocationPermission();
      }
    
で確認できます。

予測入力の候補を検索する

findAutocompletePredictions() を使用する ユーザーの検索クエリに対して場所の候補を返すことができます。 findAutocompletePredictions() は以下と同様に機能します。 getAutocompletePredictions()

次の例では、findAutocompletePredictions() を呼び出しています。

// Create a new token for the autocomplete session. Pass this to FindAutocompletePredictionsRequest,
// and once again when the user makes a selection (for example when calling fetchPlace()).
AutocompleteSessionToken token = AutocompleteSessionToken.newInstance();
// Create a RectangularBounds object.
RectangularBounds bounds = RectangularBounds.newInstance(
  new LatLng(-33.880490, 151.184363),
  new LatLng(-33.858754, 151.229596));
// Use the builder to create a FindAutocompletePredictionsRequest.
FindAutocompletePredictionsRequest request = FindAutocompletePredictionsRequest.builder()
// Call either setLocationBias() OR setLocationRestriction().
   .setLocationBias(bounds)
   //.setLocationRestriction(bounds)
   .setCountry("au")
   .setTypesFilter(Arrays.asList(PlaceTypes.ADDRESS))
   .setSessionToken(token)
   .setQuery(query)
   .build();

placesClient.findAutocompletePredictions(request).addOnSuccessListener((response) -> {
   for (AutocompletePrediction prediction : response.getAutocompletePredictions()) {
       Log.i(TAG, prediction.getPlaceId());
       Log.i(TAG, prediction.getPrimaryText(null).toString());
   }
}).addOnFailureListener((exception) -> {
   if (exception instanceof ApiException) {
       ApiException apiException = (ApiException) exception;
       Log.e(TAG, "Place not found: " + apiException.getStatusCode());
   }
});

セッション トークン

セッション トークンは、ユーザー検索のクエリフェーズと選択フェーズを 課金のための個別のセッションを作成します。すべての予測入力セッションでセッション トークンを使用することをおすすめします。ユーザーがメッセージの入力を開始すると、セッションが開始されます。 場所が選択されると終了します各セッションには 1 つの場所が選択されますセッションが終了すると トークンが有効ではなくなります。新しいトークンを生成する必要があります。 あります。

フィールド マスク

Place Details を返すメソッドでは、Place Details の 返すことができます。これにより、特定のリソースのみを (そして料金を支払う)必要があります

返されるデータ型を指定するには、Place.Field の配列を FetchPlaceRequest。次の例をご覧ください。

// Include address, ID, and phone number.
List<Place.Field> placeFields = Arrays.asList(Place.Field.ADDRESS,
                                              Place.Field.ID,
                                              Place.Field.PHONE_NUMBER);

次のフィールドの 1 つ以上を使用できます。

  • Place.Field.ADDRESS
  • Place.Field.ID
  • Place.Field.LAT_LNG
  • Place.Field.NAME
  • Place.Field.OPENING_HOURS
  • Place.Field.PHONE_NUMBER
  • Place.Field.PHOTO_METADATAS
  • Place.Field.PLUS_CODE
  • Place.Field.PRICE_LEVEL
  • Place.Field.RATING
  • Place.Field.TYPES
  • Place.Field.USER_RATINGS_TOTAL
  • Place.Field.VIEWPORT
  • Place.Field.WEBSITE_URI
で確認できます。

詳しくは、Places Data SKU をご覧ください。

Place Picker と Autocomplete の更新

このセクションでは、プレイス ウィジェット(Place Picker と 予測入力など)。

プログラムによる予測入力

予測入力が次のように変更されました。

  • PlaceAutocomplete の名前が Autocomplete に変更されました。
    • PlaceAutocomplete.getPlace の名前が Autocomplete.getPlaceFromIntent に変更されました。
    • PlaceAutocomplete.getStatus の名前が Autocomplete.getStatusFromIntent に変更されました。
  • PlaceAutocomplete.RESULT_ERROR の名前が AutocompleteActivity.RESULT_ERROR に変更されました。 (予測入力フラグメントのエラー処理は変更されていません)。

Place Picker

Place Picker は 2019 年 1 月 29 日をもってサポートを終了しました。オフになっていた 2019 年 7 月 29 日に提供を終了いたします。使用し続けると、 エラー メッセージが表示されます。新しい SDK は Place Picker に対応していません。

予測入力ウィジェット

予測入力ウィジェットが更新されました。

  • Place 接頭辞がすべてのクラスから削除されました。
  • セッション トークンのサポートを追加しました。ウィジェットがトークンを管理します 自動的にバックグラウンドで行われます。
  • 場所のタイプを選択できるフィールド マスクのサポートを追加しました。 ユーザーが選択した後に返すデータです。

以下のセクションでは、予測入力ウィジェットをプロジェクトに追加する方法について説明します。

AutocompleteFragment を埋め込む

予測入力フラグメントを追加する手順は次のとおりです。

  1. 以下に示すように、アクティビティの XML レイアウトにフラグメントを追加します。 例です。

    <fragment
      android:id="@+id/autocomplete_fragment"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:name=
    "com.google.android.libraries.places.widget.AutocompleteSupportFragment"
      />
    
  2. 予測入力ウィジェットをアクティビティに追加する手順は次のとおりです。

    • Places を初期化し、アプリケーション コンテキストと API キーを渡します。
    • AutocompleteSupportFragment を初期化します。
    • setPlaceFields() を呼び出して、必要な場所データの種類を指定します ありません。
    • PlaceSelectionListener を追加して、結果に対してなんらかの処理を行います。また、 発生しうるエラーをすべて処理します

    次の例は、アクティビティに予測入力ウィジェットを追加する方法を示しています。

    /**
     * Initialize Places. For simplicity, the API key is hard-coded. In a production
     * environment we recommend using a secure mechanism to manage API keys.
     */
    if (!Places.isInitialized()) {
        Places.initialize(getApplicationContext(), "YOUR_API_KEY");
    }
    
    // Initialize the AutocompleteSupportFragment.
    AutocompleteSupportFragment autocompleteFragment = (AutocompleteSupportFragment)
            getSupportFragmentManager().findFragmentById(R.id.autocomplete_fragment);
    
    autocompleteFragment.setPlaceFields(Arrays.asList(Place.Field.ID, Place.Field.NAME));
    
    autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() {
        @Override
        public void onPlaceSelected(Place place) {
            // TODO: Get info about the selected place.
            Log.i(TAG, "Place: " + place.getName() + ", " + place.getId());
        }
    
        @Override
        public void onError(Status status) {
            // TODO: Handle the error.
            Log.i(TAG, "An error occurred: " + status);
        }
    });
    

インテントを使用して予測入力アクティビティを起動する

  1. Places を初期化し、アプリのコンテキストと API キーを渡す
  2. Autocomplete.IntentBuilder を使用してインテントを作成し、目的の PlaceAutocomplete モード(全画面またはオーバーレイ)このインテントでは、 startActivityForResult: リクエストを識別するリクエスト コードを渡します。 使用します。
  3. onActivityResult コールバックをオーバーライドして、選択された場所を受け取ります。

次の例は、インテントを使用して予測入力を起動する方法を示しています。 結果を処理:

    /**
     * Initialize Places. For simplicity, the API key is hard-coded. In a production
     * environment we recommend using a secure mechanism to manage API keys.
     */
    if (!Places.isInitialized()) {
        Places.initialize(getApplicationContext(), "YOUR_API_KEY");
    }

    ...

    // Set the fields to specify which types of place data to return.
    List<Place.Field> fields = Arrays.asList(Place.Field.ID, Place.Field.NAME);

    // Start the autocomplete intent.
    Intent intent = new Autocomplete.IntentBuilder(
            AutocompleteActivityMode.FULLSCREEN, fields)
            .build(this);
    startActivityForResult(intent, AUTOCOMPLETE_REQUEST_CODE);

    ...

    /**
     * Override the activity's onActivityResult(), check the request code, and
     * do something with the returned place data (in this example its place name and place ID).
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == AUTOCOMPLETE_REQUEST_CODE) {
            if (resultCode == RESULT_OK) {
                Place place = Autocomplete.getPlaceFromIntent(data);
                Log.i(TAG, "Place: " + place.getName() + ", " + place.getId());
            } else if (resultCode == AutocompleteActivity.RESULT_ERROR) {
                // TODO: Handle the error.
                Status status = Autocomplete.getStatusFromIntent(data);
                Log.i(TAG, status.getStatusMessage());
            } else if (resultCode == RESULT_CANCELED) {
                // The user canceled the operation.
            }
        }
    }

Place Picker はご利用いただけなくなりました

Place Picker は 2019 年 1 月 29 日をもってサポートを終了しました。オフになっていた 2019 年 7 月 29 日に提供を終了しました。使用し続けると、 エラー メッセージが表示されます。新しい SDK は Place Picker に対応していません。