Places SDK for Android を使用すると、デバイスで現在報告されている位置情報にある場所を見つけることができます。場所の例としては、地域のお店やサービス、スポット、地理的位置などがあります。
権限
ライブラリを使用するために、アプリのマニフェストで追加の権限を宣言する必要はありません。ライブラリは、使用するすべての権限をマニフェストで宣言します。ただし、アプリで PlacesClient.findCurrentPlace()
を使用している場合は、実行時に位置情報の利用許可をリクエストする必要があります。
アプリで PlacesClient.findCurrentPlace()
を使用していない場合は、マニフェストに次の行を追加して、ライブラリによって導入された ACCESS_FINE_LOCATION
権限と ACCESS_COARSE_LOCATION
権限を明示的に削除します。
<manifest ... xmlns:tools="http://schemas.android.com/tools"> ... <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" tools:node="remove"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" tools:node="remove"/> ... </manifest>
権限の詳細を確認し、 EasyPermissions を使用することを検討してください。
現在の場所を取得する
デバイスが現在設置されているローカル ビジネスやその他の場所を見つける手順は次のとおりです。
ContextCompat.checkSelfPermission
を呼び出して、ユーザーがデバイスの位置情報にアクセスする権限を付与しているかどうかを確認します。アプリには、ユーザーに許可を求めて結果を処理するコードも含める必要があります。 詳細については、アプリの権限をリクエストするをご覧ください。FindCurrentPlaceRequest
を作成してPlace.Field
のList
を渡し、アプリがリクエストする場所のデータタイプを指定します。PlacesClient.findCurrentPlace()
を呼び出し、前の手順で作成したFindCurrentPlaceRequest
を渡します。FindCurrentPlaceResponse
からPlaceLikelihood
のリストを取得します。
フィールドは Place Search の結果に対応しており、Basic(基本)、Contact(連絡先)、Atmosphere(雰囲気)の 3 つの請求カテゴリに分けられます。基本フィールドは基本レートで課金され、追加料金は発生しません。Contact フィールドと Atmosphere フィールドはより高いレートで課金されます。プレイスデータ リクエストの課金方法の詳細については、使用量と課金をご覧ください。
API は、Task
で FindCurrentPlaceResponse
を返します。FindCurrentPlaceResponse
には、デバイスがある可能性が高い場所を表す PlaceLikelihood
オブジェクトのリストが含まれています。結果には、場所ごとに、その場所が正しいものである可能性が示されます。指定したデバイスの位置に対応する既知の場所がない場合、リストは空になることがあります。
PlaceLikelihood.getPlace()
を呼び出すと Place
オブジェクトを取得できます。また、PlaceLikelihood.getLikelihood()
を呼び出して、場所の可能性評価を取得できます。値が大きいほど、その場所が最もよくマッチする確率が高くなります。
次のコードサンプルは、デバイスが存在する可能性が高い場所のリストを取得し、各場所の名前と可能性をログに記録します。
Kotlin
// Use fields to define the data types to return. val placeFields: List<Place.Field> = listOf(Place.Field.NAME) // Use the builder to create a FindCurrentPlaceRequest. val request: FindCurrentPlaceRequest = FindCurrentPlaceRequest.newInstance(placeFields) // Call findCurrentPlace and handle the response (first check that the user has granted permission). if (ContextCompat.checkSelfPermission(this, permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { val placeResponse = placesClient.findCurrentPlace(request) placeResponse.addOnCompleteListener { task -> if (task.isSuccessful) { val response = task.result for (placeLikelihood: PlaceLikelihood in response?.placeLikelihoods ?: emptyList()) { Log.i( TAG, "Place '${placeLikelihood.place.name}' has likelihood: ${placeLikelihood.likelihood}" ) } } else { val exception = task.exception if (exception is ApiException) { Log.e(TAG, "Place not found: ${exception.statusCode}") } } } } else { // A local method to request required permissions; // See https://developer.android.com/training/permissions/requesting getLocationPermission() }
Java
// Use fields to define the data types to return. List<Place.Field> placeFields = Collections.singletonList(Place.Field.NAME); // Use the builder to create a FindCurrentPlaceRequest. FindCurrentPlaceRequest request = FindCurrentPlaceRequest.newInstance(placeFields); // Call findCurrentPlace and handle the response (first check that the user has granted permission). if (ContextCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { Task<FindCurrentPlaceResponse> placeResponse = placesClient.findCurrentPlace(request); placeResponse.addOnCompleteListener(task -> { if (task.isSuccessful()){ FindCurrentPlaceResponse response = task.getResult(); for (PlaceLikelihood placeLikelihood : response.getPlaceLikelihoods()) { Log.i(TAG, String.format("Place '%s' has likelihood: %f", placeLikelihood.getPlace().getName(), placeLikelihood.getLikelihood())); } } else { Exception exception = task.getException(); 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(); }
Likelihood 値について:
- 可能性は、1 回のリクエストに対して返された場所のリストの中で最も一致する場所である相対的な確率を示します。異なるリクエスト間で可能性を比較することはできません。
- 可能性の値は 0.0 ~ 1.0 の間になります。
たとえば、正しい場所が場所 A である可能性が 55%、場所 B である可能性が 35% であることを表す場合、レスポンスには 2 つのメンバー(可能性は 0.55 の場所 A、場所 B は 0.35)が含まれます。
アプリに属性を表示する
アプリに PlacesClient.findCurrentPlace()
から取得した情報を表示する場合、アプリは属性も表示する必要があります。詳しくは、アトリビューションに関するドキュメントをご覧ください。