このガイドでは、プレイス アカウント間の変更について説明します。 互換性ライブラリと、新しいスタンドアロン バージョンの 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 プロジェクトに追加します。
プレイス互換性ライブラリを現在ご使用の場合:
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'
現在、Places SDK for Android の Play 開発者サービス バージョンを使用している場合:
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'
Gradle プロジェクトを同期します。
アプリ プロジェクトの
minSdkVersion
を 16 以上に設定します。「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
アプリをビルドします。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()
。
場所を取得する手順は次のとおりです。
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();
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()
と同様です。
場所の写真を取得する手順は次のとおりです。
fetchPlace()
への呼び出しを設定します。必ず リクエストのPHOTO_METADATAS
フィールドは次のとおりです。List<Place.Field> fields = Arrays.asList(Place.Field.PHOTO_METADATAS);
プレイス オブジェクトを取得します(この例では
fetchPlace()
を使用していますが、findCurrentPlace()
):FetchPlaceRequest placeRequest = FetchPlaceRequest.builder(placeId, fields).build();
OnSuccessListener
を追加して、結果のFetchPlaceResponse
でPlace
を指定し、結果として得られる写真のメタデータを使用して、 ビットマップと帰属表示テキストを取得します。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()
。
ユーザーのデバイスの現在地を取得する手順は次のとおりです。
アプリが
ACCESS_FINE_LOCATION
をリクエストしていることを確認し、ACCESS_WIFI_STATE
権限。ユーザーは、各自の設定内容に デバイスの位置情報を表示しますApp をリクエストする 権限 表示されます。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();
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
を埋め込む
予測入力フラグメントを追加する手順は次のとおりです。
以下に示すように、アクティビティの 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" />
予測入力ウィジェットをアクティビティに追加する手順は次のとおりです。
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); } });
インテントを使用して予測入力アクティビティを起動する
Places
を初期化し、アプリのコンテキストと API キーを渡すAutocomplete.IntentBuilder
を使用してインテントを作成し、目的のPlaceAutocomplete
モード(全画面またはオーバーレイ)このインテントでは、startActivityForResult
: リクエストを識別するリクエスト コードを渡します。 使用します。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 に対応していません。