クリエイターブログ/システム開発

システム開発

Androidアプリにおける位置情報の取得方法

概要

Androidのアプリ開発において位置情報を利用したいことがあります。
今回は位置情報取得の推奨APIであるGoogle Location Services API(以下、LocationAPI)を用いて実装を行います。

※注意
〇LocationAPIを使用するためにはGooglePlayService(Google Play開発者サービス)が端末にインストールされている必要があります。
 すべてのAndroid端末にインストールされているものではないので、プログラム等でチェックを行ってください。
〇位置情報の取得に必要となる権限は以下のものとなります。
・android.permission.ACCESS_FINE_LOCATION
 権限を与えたうえで実行してください。(権限を与えずに実行すると、アプリが正しく実行しないので注意してください。)
〇位置情報取得の際には端末の位置情報機能がONである必要があります。
 機能をONであることを確認してください。

実装

今回は3 STEPで紹介します。
なお、照会するコードは以下のインターフェイスが実装されたActivityのものとします。
・GoogleApiClient.ConnectionCallbacks
・GoogleApiClient.OnConnectionFailedListener
・LocationListener

GoogleApiClientに接続し、位置情報リクエストを作成する

GoogleApiClientに接続します。


GoogleApiClient mGoogleApiClient;    //GoogleApiClientインスタンス変数
LocationRequest mLocationRequest;    //位置情報リクエストインスタンス変数

//GoogleApiClientに接続
mGoogleApiClient = new GoogleApiClient.Builder(Activity.this)
                         .addApi(LocationServices.API)
                         .addConnectionCallbacks(Activity.this)
                         .addOnConnectionFailedListener(Activity.this)
                         .build();

接続を行うと状態に応じて以下のonConnected(),onConnectionSuspended(),onConnectionFailed()のいずれかが実行されます。
接続が完了するとonConnected()が実行されるので、onConnected()で位置情報リクエストを作成します。


@Override
public void onConnected(@Nullable Bundle bundle) {
    // 接続完了時の処理
    // 接続完了したのでリスエストを発行
    mLocationRequest = new LocationRequest();
    mLocationRequest.setInterval(1000);                                      //更新間隔(ms)
    mLocationRequest.setFastestInterval(500);                                //最速更新間隔(ms)
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);    //精度区分
}

@Override
public void onConnectionSuspended(int i) {
    // 接続が途絶えた時の処理
    // 再接続などの処理を行います。
    mGoogleApiClient.connect();
}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
    // 接続失敗時の処理
    // GooglePlayServiceが端末にインストールされていない場合や
    // GooglePlayServiceのアップデートが必要な場合、エラーとなりここに飛んできます。
}

位置情報の更新間隔はLocationRequest.setInterval()およびLocationRequest.setFastestInterval()で設定します。
どちらの更新間隔が適応されるかは、他の位置情報取得アプリとの干渉具合によります。

位置情報の精度はLocationRequest.setPriority()で設定します。
今回は可能な限りの最高精度で取得するため、LocationRequest.PRIORITY_HIGH_ACCURACYを設定します。

位置情報を取得する

GoogleApiClientと位置情報リクエストのインスタンスを使用して、実際に位置情報を取得します。
※この処理までに権限の付与および位置情報がONになっている前提とします。


//位置情報を取得
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, Activity.this);

位置情報の取得が完了するとonLocationChanged()が実行されます。


@Override
public void onLocationChanged(Location location) {
    // 位置情報が取得(更新)されたときの処理
    double latitude = location.getLatitude();    //緯度
    double longitude = location.getLongitude();	//経度
}

取得されたLocationからは緯度経度のほか、高度や時間、速度などの情報を取得することができます。

位置情報の取得を終了する

更新間隔ごとに位置情報が更新されます。終了する際は以下の処理を実行します。


LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, Activity.this);

取得を再開させたいときは再度、LocationServices.FusedLocationApi.requestLocationUpdates()を実行してください。

まとめ

以上がGoogle Location Services APIを用いての位置情報取得方法となります。
位置情報の更新間隔が短かったり、精度が高かったりするとバッテリーを多く消費するので、注意して実装してください。

最新記事

クリエイターブログの関連リンク