こんにちは。中間テスト終わりました。
今回はやばい台風が来るそうなので気圧が測れるアプリを作りたいと思います。

スマホにはいろんなセンサーがついている

せっかくなので使いましょう。
というのは建前で本当は この記事 でやってることAndroidでも作れるのではと思ったのが本当の理由。

紹介

端末 Pixel 3 XL
Android バージョン Android 10
最低バージョン ろりぽっぷ
言語 Kotlin

実装

レイアウト

真ん中にTextViewを置いただけのものとする。
面倒なのでConstraintLayoutをそのまま使うことにする。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="50dp"
android:id="@+id/barometer_tv"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

コード

Sensor.TYPE_PRESSUREが気圧計になります。
onDestroy()で登録を解除しています。
受け取るセンサーがほかにもあるときはevent?.sensor?.typeを利用して分けましょう。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
lateinit var sensorManager: SensorManager
lateinit var sensorEventListener: SensorEventListener
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
//今回は気圧計
val sensorList = sensorManager.getSensorList(Sensor.TYPE_PRESSURE)
//受け取る
sensorEventListener = object : SensorEventListener {
override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {
//つかわん
}

override fun onSensorChanged(event: SensorEvent?) {
//値はここで受けとる
//今回は気圧計のみだからいいけどほかにも登録するときは分岐してね
if(event?.sensor?.type == Sensor.TYPE_PRESSURE){
//気圧計の値
val barometer = event.values[0]
//TextViewに設定
barometer_tv.text = "$barometer hPa"
}
}
}
//登録
sensorManager.registerListener(
sensorEventListener,
sensorList[0], //配列のいっこめ。気圧計
SensorManager.SENSOR_DELAY_NORMAL //更新頻度
)
}

override fun onDestroy() {
super.onDestroy()
sensorManager.unregisterListener(sensorEventListener)
}

これでTextViewに気圧が表示されてると思います。

Screenshot_20191011-112836.png
Screenshot_20191011-112836.png

小数点を消す

できれいになります。
1
2
3
4
5
6
7
8
9
10
11
12
13


```kotlin
//値はここで受けとる
//今回は気圧計のみだからいいけどほかにも登録するときは分岐してね
if(event?.sensor?.type == Sensor.TYPE_PRESSURE){
//気圧計の値
val barometer = event.values[0]
//整数に
val barometerInt = barometer.roundToInt()
//TextViewに設定
barometer_tv.text = "$barometerInt hPa\n($barometer hPa)"
}
Screenshot_20191011-113656.png
Screenshot_20191011-113656.png

以上です。
お疲れ様です。88888