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 つの請求カテゴリに分けられます。Basic フィールドは基本レートで課金され、追加料金はかかりません。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% であることを表す場合、レスポンスには、可能性が 0.55 で場所 A と 0.35 で場所 B の 2 つのメンバーが含まれます。
アプリに属性を表示する
PlacesClient.findCurrentPlace()
から取得した情報をアプリに表示する場合は、属性も表示する必要があります。詳しくは、アトリビューションに関するドキュメントをご覧ください。