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

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

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

注: アプリがバックグラウンドで実行されている場合の位置情報へのアクセスは、アプリのコア機能にとって不可欠なものでなければなりません。また、位置情報にアクセスすることをユーザーに適切に開示する必要があります。

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

Google Play 開発者サービスをセットアップする

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

アプリの権限を指定する

位置情報サービスを使用するアプリは、位置情報に関する権限をリクエストする必要があります。Android には、位置情報に関する次の権限が用意されています。

デバイスの位置情報にアクセスするには、ACCESS_COARSE_LOCATION または ACCESS_FINE_LOCATION をリクエストします。選択した権限によって、FusedLocationProviderClient API から返される位置情報の精度が決まります。

  • ACCESS_COARSE_LOCATION を指定すると、API は Wi-Fi またはモバイルデータ、あるいはその両方を使用してデバイスの位置を特定できます。API は、都市の 1 区画とほぼ同じ精度の位置情報を返します。
  • ACCESS_FINE_LOCATION を指定すると、API は利用可能な位置情報提供元(GPS、Wi-Fi、モバイルデータなど)からできる限り正確な位置情報を判断できます。

アプリが Android 10(API レベル 29)以上を対象としていて、バックグラウンドでの実行中にデバイスの位置情報にアクセスする必要がある場合は、ACCESS_BACKGROUND_LOCATION 権限も宣言する必要があります。詳細については、定期的に現在地の更新情報を受け取る方法のガイドをご覧ください。

このレッスンでは、大まかな位置情報のみを取得します。この権限は、次のコード スニペットに示すように、アプリ マニフェスト内の uses-permission 要素を使用してリクエストします。

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.google.android.gms.location.sample.basiclocationsample" >

      <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    </manifest>
    

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

次のコード スニペットに示すように、アクティビティの 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 開発者サービスが再起動されたが、サービスの再起動後に位置情報をリクエストしたアクティブな融合された位置予測プロバイダ クライアントが存在しなかった。この状況を回避するには、新しいクライアントを作成して、独自に位置情報の更新をリクエストします。詳細については、現在地の更新情報を受け取る方法をご覧ください。

現在の最良推定値を維持する

最近呼び出した getLastLocation() で取得した Location オブジェクトが最も正確だと思うかもしれませんが、位置情報の精度は変化するため、最近取得した値が必ずしも最も正確であるとは限りません。そのため、表示する位置情報をいくつかの基準に基づいて選択するためのロジックが必要になります。また、この一連の基準も、アプリのユースケースやフィールド テストの結果によって異なります。

getLastLocation() から返される位置情報の精度を検証するには、以下を含む手順を実行します。

  • 取得した位置情報が以前に取得した位置情報よりかなり新しいかどうかを確認します。
  • 位置情報の精度が以前の推定値の精度より高いか低いかを確認します。
  • 新しい位置情報に関連付けられている提供元を確認します。この提供元が、アプリのキャッシュに保存されている位置情報の提供元より信頼できるかどうかを判断します。