Android アプリ開発 「MATRIX」

Androidアプリの開発に役立つサンプル集



GPSを利用したスピードメーター(速度計)の作り方

GPSを利用したスピードメーター(速度計)

今回はGPSを利用したシンプルなスピードメーター(速度計)の作り方です。

Android Java には現在の速度を「m/s」単位で取得できる関数「getSpeed」があるので、GPSの位置情報からいちいち速度を計算する必要はありませんが、取得できる間隔が「1秒」と長いので、短時間で速度が変化するような場合の速度測定には向かないかもしれません。

サンプルコード①(MainActivity.java

詳しい説明はコード内のコメントを見てください。 

//メインアクティビティ(implementsGPSを監視できるようにしてある)
public class MainActivity extends AppCompatActivity implements LocationListener {

private LocationManager locationManager; //ロケーションマネージャー
private TextView textView; //速度表示用
private float speed = 0f; //速度用の変数

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//レイアウトファイルをセット
setContentView(R.layout.activity_main);
//アクションバーを隠す
ActionBar actionBar = getSupportActionBar();
actionBar.hide();
//ロケーションマネージャーに端末のロケーションサービスを関連付ける
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
//レイアウトファイルからテキストビューを取得する
textView = (TextView) findViewById(R.id.speed_text);
}

@Override
protected void onPause() {
super.onPause();
//ポーズ時にはGPS(位置情報)の取得を解除する
locationManager.removeUpdates(this);
}

@Override
protected void onResume() {
super.onResume();
//GPS(位置情報)の取得が許可があるのかをチェック
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

//GPSの使用が許可されていなければパーミッションを要求し、その後再度チェックが行われる
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);

return;
}
//ロケーションマネージャーにGPS(位置情報)のリクエストを開始する
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
}

@Override
public void onLocationChanged(Location location) {
  //
速度が出ている?
if(location.hasSpeed()) {
//速度が出ている時(km/hに変換して変数speedへ
speed = location.getSpeed() * 3.6f;
} else {
//速度が出ていない時
speed = 0;
}
//速度を表示する
textView.setText(speed + " km/h");
}

@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
//必要に応じてプログラムを書く(省略はできない)
}

@Override
public void onProviderEnabled(String s) {
//必要に応じてプログラムを書く(省略はできない)
}

@Override
public void onProviderDisabled(String s) {
//必要に応じてプログラムを書く(省略はできない)
}
}

サンプルコード②(activity_main.xml

レイアウトは、画面の中央にスピードを表示するテキストビューがあるだけのシンプルな構造です。 

<TextView
android:id="@+id/speed_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0 km/h"
android:textSize="36sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />

実行結果

実行するとアプリが「位置情報(GPS)」使用の許可を要求してくる。

f:id:vw-dsg:20181008223619j:plain

「OK(ALLOW)」を選択するとすぐに速度の測定が開始されます。

f:id:vw-dsg:20181008223055j:plain

備考・その他

このサンプルアプリは、バックグラウンドに移動するとGPSを停止して速度の測定を一時中断する仕組みになっているので、バックグラウンドに残してあってもGPSで電力を消費することはありません。 

END