6 月 3 日の「#Android11: The Beta Launch Show」にぜひご参加ください。

最新の位置情報を取得する

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

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

注: Android 8.0(API レベル 26)以上では、バックグラウンドで実行中のアプリが現在の位置情報をリクエストした場合、デバイスは 1 時間に数回だけ位置情報を計算します。この制限にアプリを適応させる方法については、バックグラウンド位置情報の制限をご覧ください。

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

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

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

アプリの権限を指定する

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

デバイスの位置情報にアクセスするには、ACCESS_COARSE_LOCATION または ACCESS_FINE_LOCATION をリクエストします。どちらの権限を選択するかによって、API が返す位置情報の精度が決まります。ACCESS_COARSE_LOCATION を指定すると、API はほぼ都市の区画に相当する精度で位置情報を返します。

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