直近の現在地情報を取得する

Google Play 開発者サービスの位置情報 API を使用すると、アプリはユーザーのデバイスの最後に認識された位置情報をリクエストできます。ほとんどの場合、必要なのはユーザーの現在地です。これは通常、デバイスで最後に認識された位置情報と同じです。

具体的には、Fused Location Provider を使用して、デバイスで最後に記録された位置情報を取得します。Fused Location Provider は、Google Play 開発者サービスの Location API の 1 つです。基盤となる位置情報テクノロジーを管理し、高精度や低電力などの要件を高いレベルで指定できるように API を提供します。また、デバイスの電池の消費を最適化します。

このレッスンでは、Fused Location Provider の getLastLocation() メソッドを使用して、デバイスの位置情報を 1 回だけリクエストする方法について説明します。

Google Play 開発者サービスのセットアップ

Fused Location Provider にアクセスするには、アプリの開発プロジェクトに Google Play 開発者サービスを含める必要があります。SDK Manager を使用して Google Play 開発者サービス コンポーネントをダウンロードしてインストールし、プロジェクトにライブラリを追加します。詳しくは、Google Play 開発者サービスをセットアップするをご覧ください。

アプリの権限を指定する

位置情報サービスを使用する機能を含むアプリは、その機能のユースケースに応じて、位置情報の利用許可をリクエストする必要があります。

位置情報サービス クライアントを作成する

アクティビティの onCreate() メソッドで、次のコード スニペットに示すように、Fused Location Provider Client のインスタンスを作成します。

private lateinit var fusedLocationClient: FusedLocationProviderClient

override fun onCreate(savedInstanceState: Bundle?) {
    // ...

    fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
}

直近の現在地情報を取得する

位置情報サービス クライアントを作成したら、ユーザーのデバイスの最後に確認された位置情報を取得できます。Fused Location Provider の getLastLocation() メソッドを使用して、デバイスの位置情報を取得します。この呼び出しによって返される位置情報の精度は、位置情報の利用許可をリクエストする方法に関するガイドに記載されているように、アプリ マニフェストに設定した権限設定によって決まります。

直近の位置情報をリクエストするには、getLastLocation() メソッドを呼び出します。次のコード スニペットは、リクエストとレスポンスの基本的な処理を示しています。

fusedLocationClient.lastLocation
    .addOnSuccessListener { location: Location? ->
        // Got last known location. In some rare situations this can be null.
    }

getLastLocation() メソッドは Task を返します。これを使用して、地理的位置の緯度と経度の座標を含む Location オブジェクトを取得できます。次のような状況では、位置情報オブジェクトが null になることがあります。

  • デバイスの設定で位置情報がオフになっている。位置情報を無効にするとキャッシュもクリアされるため、以前に最後の位置情報が取得されていた場合でも、結果が null になることがあります。
  • デバイスの位置情報が一度も記録されていない。新しいデバイスや、出荷時の設定に復元されたデバイスの場合に、この状況が発生することがあります。
  • デバイスの Google Play 開発者サービスが再起動され、サービスの再起動後に位置情報をリクエストしたアクティブな Fused Location Provider クライアントがない。このような状況を回避するには、新しいクライアントを作成して、位置情報の更新を自分でリクエストします。詳細については、位置情報の更新をリクエストするをご覧ください。

位置情報の最良推定値を選択する

FusedLocationProviderClient には、デバイスの位置情報を取得するためのメソッドがいくつか用意されています。アプリのユースケースに応じて、次のいずれかを選択します。

  • getLastLocation() は、位置情報の推定をより迅速に取得し、アプリに起因するバッテリー使用量を最小限に抑えます。ただし、最近位置情報を積極的に使用したクライアントが他にない場合、位置情報が古くなっている可能性があります。
  • getCurrentLocation() は、より新しく、より正確な位置情報をより一貫して取得します。ただし、この方法では、デバイスでアクティブな位置情報の計算が行われる可能性があります。

    これは、新しい位置情報を取得する場合に可能な限り推奨される方法であり、requestLocationUpdates() を使用してご自身で位置情報の更新を開始、管理するなどの他の方法よりも安全です。アプリで requestLocationUpdates() を呼び出すと、位置情報が利用できない場合、または新しい位置情報の取得後にリクエストが正しく停止されない場合に、大量の電力を消費することがあります。

参考情報

Android で現在地を取得する方法について詳しくは、次の資料をご覧ください。

サンプル