package com.example.mycompass import android.hardware.Sensor import android.hardware.SensorEvent import android.hardware.SensorEventListener import android.hardware.SensorManager import android.os.Bundle import android.widget.ImageView import android.widget.TextView import androidx.appcompat.app.AppCompatActivity class MainActivity : AppCompatActivity(){ lateinit var imageView: ImageView lateinit var textView: TextView lateinit var sensorManager: SensorManager lateinit var sensorAccelerometer: Sensor lateinit var sensorMagneticField: Sensor private var floatGravity = FloatArray(3) private var floatGeoMagnetic = FloatArray(3) private val floatOrientation = FloatArray(3) private val floatRotationMatrix = FloatArray(9) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) imageView = findViewById(R.id.imageView_compass) textView = findViewById(R.id.textView_under) sensorManager = getSystemService(SENSOR_SERVICE) as SensorManager sensorAccelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) sensorMagneticField = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) val sensorEventListenerAccelerometer: SensorEventListener = object : SensorEventListener { override fun onSensorChanged(event: SensorEvent) { floatGravity = event.values SensorManager.getRotationMatrix( floatRotationMatrix, null, floatGravity, floatGeoMagnetic ) SensorManager.getOrientation(floatRotationMatrix, floatOrientation) val degree = (-floatOrientation[0] * 180 / 3.14159).toFloat() imageView.setRotation(degree) textView.setText(degree.toString()) } override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) {} } val sensorEventListenerMagneticField: SensorEventListener = object : SensorEventListener { override fun onSensorChanged(event: SensorEvent) { floatGeoMagnetic = event.values SensorManager.getRotationMatrix( floatRotationMatrix, null, floatGravity, floatGeoMagnetic ) SensorManager.getOrientation(floatRotationMatrix, floatOrientation) val degree = (-floatOrientation[0] * 180 / 3.14159).toFloat() imageView.setRotation(degree) textView.setText(degree.toString()) } override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) {} } sensorManager.registerListener( sensorEventListenerAccelerometer, sensorAccelerometer, SensorManager.SENSOR_DELAY_NORMAL ) sensorManager.registerListener( sensorEventListenerMagneticField, sensorMagneticField, SensorManager.SENSOR_DELAY_NORMAL ) } }