直近の位置情報を取得する

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

デバイスの直近の位置情報を取得するには、融合された位置予測プロバイダを使用します。融合された位置予測プロバイダは Google Play 開発者サービスの位置情報 API の 1 つです。基盤となる位置情報テクノロジーを管理し、高精度や省電力といったハイレベルの要件を指定できるシンプルな API を提供します。また、デバイスの電池の消費を最適化します。

注: アプリがバックグラウンドで実行される場合、位置情報へのアクセスがアプリの中核的機能にとって必要不可欠であることと、位置情報へのアクセスをユーザーに適切に開示することが要件として求められます。

このレッスンでは、融合された位置予測プロバイダの getLastLocation() メソッドを使用して、デバイスの位置情報を 1 回だけリクエストする方法を説明します。

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

融合された位置予測プロバイダにアクセスするには、アプリの開発プロジェクトに Google Play 開発者サービスが含まれている必要があります。Google Play 開発者サービスのコンポーネントを SDK Manager でダウンロードしてインストールし、ライブラリをプロジェクトに追加します。詳細については、Google Play 開発者サービスをセットアップする方法のガイドをご覧ください。

アプリの権限を指定する

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

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

アクティビティの onCreate() メソッドで、融合された位置予測プロバイダ クライアントのインスタンスを作成します。次のコード スニペットをご覧ください。

Kotlin

private lateinit var fusedLocationClient: FusedLocationProviderClient

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

    fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
}

Java

private FusedLocationProviderClient fusedLocationClient;

// ..

@Override
protected void onCreate(Bundle savedInstanceState) {
    // ...

    fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
}

直近の位置情報を取得する

位置情報サービス クライアントを作成すると、ユーザーのデバイスが最後に確認された場所の位置情報を取得できます。アプリがこれらに接続されていれば、融合された位置予測プロバイダの getLastLocation() メソッドを使用してデバイスの位置情報を取得できます。この呼び出しが返す位置情報の精度は、位置情報権限をリクエストする方法のガイドに記載されているとおり、アプリ マニフェストの権限設定によって決まります。

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

Kotlin

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

Java

fusedLocationClient.getLastLocation()
        .addOnSuccessListener(this, new OnSuccessListener<Location>() {
            @Override
            public void onSuccess(Location location) {
                // Got last known location. In some rare situations this can be null.
                if (location != null) {
                    // Logic to handle location object
                }
            }
        });

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

  • デバイスの設定で位置情報がオフになっている。位置情報を無効にするとキャッシュも削除されるため、直近の位置情報が以前に取得されていても、結果が null になる可能性があります。
  • デバイスが位置情報を記録していなかった。このケースは、新しいデバイスまたは出荷時の設定に戻されたデバイスで起きる可能性があります。
  • デバイスで Google Play 開発者サービスが再起動されたが、サービスの再起動後に位置情報をリクエストしたアクティブな融合された位置予測プロバイダ クライアントが存在しなかった。この状況を回避するには、新しいクライアントを作成して、独自に位置情報の更新データをリクエストします。詳細については、現在地の更新情報を受け取るをご覧ください。

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

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

  • getLastLocation() は、位置情報の推定値をよりすばやく取得し、アプリに関連するバッテリー使用量を最小限に抑えます。ただし、直近で他のクライアントが位置情報をアクティブに使用していない場合は、位置情報が最新でない可能性があります。
  • getCurrentLocation() は、より新しく正確な位置情報をより頻繁に取得します。ただし、このメソッドを使用すると、デバイス上でアクティブな位置情報の計算が行われる可能性があります。

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