今回はGPSを利用した単純な速度計の作り方のポイントをご紹介します。以前は LocationManager を取得して LocationListener の onLocationChanged でデータを取得しましたが、現在は FusedLocationProviderClient の LocationCallback でデータで取得するようになっています。
<完成イメージ>
画面中央に現在のスピード(時速)が表示されるだけのシンプルなレイアウトです。

<レイアウト>
レイアウトファイルに「speedText」というIDのテキストビューを配置します。このテキストビューにスピードを表示します。
<TextView
android:id="@+id/speedText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Please wait..."
android:textColor="#FFFFFF"
android:textSize="60sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<必要な権限・設定>
~ 権限取得 ~
GPSを利用したスピードメーターを作るために必要となる権限は「正確な位置情報」と「おおよその位置情報」の2つです。
この2つの権限をマニフェストファイルで宣言して、さらに、プログラム内でユーザーから位置情報へのアクセス許可をもらう必要があります。
- ACCESS_FINE_LOCATION(正確な位置情報)
- ACCESS_COARSE_LOCATION(おおよその位置情報)
※ユーザーから位置情報のアクセス許可を取得する方法は以下を参照ください。
~ グラドルファイル編集 ~
build.gradle.kts(:app) ファイルを開き「dependencies { }」内に以下の1行を追加してシンクロ(画面上部に表示される Sync Now をクリック)します。
implementation("com.google.android.gms:play-services-location:21.3.0")
<作成手順>
おおまかな手順は以下となります。
- 位置情報のアクセス許可を取得する
- FusedLocationProviderClient を取得する
- LocationRequest を作成
- LocationCallback を設定
- コールバック内で速度を取得して表示する
~ 手順解説 ~
1.位置情報のアクセス許可の取り方はこちらを参照ください。
2.FusedLocationProviderClient を取得
var fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this)
3.LocationRequest を作成
優先度(Priority)は「PRIORITY_HIGH_ACCURACY(高精度)」を指定します。以下の例では位置情報の取得頻度を0.5秒間隔に指定していますが、実際の取得間隔は端末やGPS信号の強さなどで頻繁に変化します。
var locationRequest: LocationRequest = LocationRequest.Builder(
Priority.PRIORITY_HIGH_ACCURACY,500).build()
4.LocationCallback を作成
LocationCallback を作成してプログラム全体から参照できるように配置します。
locationCallback = object : LocationCallback() {
override fun onLocationResult(p0: LocationResult) {
super.onLocationResult(p0)
//ここに処理を記述
}
}
5.コールバック内に速度(m/s)を取得し、それを時速(km/h)に変換してテキストビュー「textView_speed(レイアウトファイルでは R.id.speedText)」に表示するコードを記述します。
//速度を取得して時速に変換
var speed = Math.round(p0.locations[0].speed * 3.6)
//テキストビューに表示する
textView_speed.text = speed.toString() + " km/h"
5で作成したコードをコールバック内に記述してコールバックは完成です。
locationCallback = object : LocationCallback() {
override fun onLocationResult(p0: LocationResult) {
super.onLocationResult(p0)
//速度を取得して時速に変換
var speed = Math.round(p0.locations[0].speed * 3.6)
//テキストビューに表示する
textView_speed.text = speed.toString() + " km/h"
}
}
<実行イメージ>
アプリを起動して数秒待つと速度が表示されます。

<備考・まとめ>
GPS速度情報の取得方法が LocationManager を利用する方法から FusedLocationProviderClient に変わったことで、最初は少し手間取るかもしれませんが、一度手順を覚えてしまうと新しい方法の方が作りやすいと感じるようになりますので、ぜひ、じっくり時間をかけて習得してください。
END