Werte vom Sensor nur jede Minute lesen

  • Antworten:3
  • OffenNicht stickyBentwortet
  • Forum-Beiträge: 308

06.04.2020, 11:44:57 via Website

Hallo zusammen

Ich möchte in meinem Programm die Werte vom Sensor nur jede Minute lesen. Ich habe dies mit einem Händler gemacht.

package ch.robbisoft.sensortest

import android.content.Context
import android.hardware.Sensor
import android.hardware.SensorEvent
import android.hardware.SensorEventListener
import android.hardware.SensorManager
import android.os.Bundle
import android.os.Handler
import android.support.v7.app.AppCompatActivity
import android.view.View
import android.widget.TextView
import java.util.*

class MainActivity : AppCompatActivity(), SensorEventListener {
//Luftdruck
private var sensorManager: SensorManager? = null
private var pressur: Sensor? = null
private var txt_durck: TextView? = null
//Temperatur
private var temp: Sensor? = null
private var txt_temperatur: TextView? = null
//Luftfeuchtigkeit
private var feucht: Sensor? = null
private var txt_feuchttxt: TextView? = null

private var f_feucht : Float = 0.0f
private var f_temparatur : Float = 0.0f
private var f_druck : Float = 0.0f

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    //Händler
    val steuerung = Handler()

    txt_durck = findViewById<View>(R.id.txt_druck) as TextView
    txt_temperatur = findViewById<View>(R.id.txt_temp) as TextView
    txt_feuchttxt = findViewById<View>(R.id.txt_feucht) as TextView
    sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
    if (sensorManager!!.getDefaultSensor(Sensor.TYPE_PRESSURE) != null) { // Success! There's a pressure sensor.
        pressur = sensorManager!!.getDefaultSensor(Sensor.TYPE_PRESSURE)
        temp = sensorManager!!.getDefaultSensor(Sensor.TYPE_AMBIENT_TEMPERATURE)
        feucht = sensorManager!!.getDefaultSensor(Sensor.TYPE_RELATIVE_HUMIDITY)
    } else { // Failure! No pressure sensor.
        txt_durck!!.text = "kein Sensor vorhanden"
    }

    val ereignis = object : Runnable{
        override fun run() {
            txt_durck!!.text = String.format("%#.2f hPa", f_druck)
            txt_temperatur!!.text = String.format("%#.2f°", f_temparatur)
            txt_feuchttxt!!.text = String.format("%#.2f", f_feucht) + "%"
            steuerung.postDelayed(this, 60000L)
        }
    }
    steuerung.postDelayed(ereignis, 0L)
}

override fun onSensorChanged(sensorEvent: SensorEvent) {
    val f_wert: Float
    val n_typ: Int
    n_typ = sensorEvent.sensor.type
    when (n_typ) {
        Sensor.TYPE_PRESSURE -> {
            f_druck = sensorEvent.values[0]

// f_wert = sensorEvent.values[0]
// txt_durck!!.text = String.format("%#.2f hPa", f_wert)
}
Sensor.TYPE_AMBIENT_TEMPERATURE -> {
f_temparatur = sensorEvent.values[0]
// f_wert = sensorEvent.values[0]
// txt_temperatur!!.text = String.format("%#.2f°", f_wert)
}
Sensor.TYPE_RELATIVE_HUMIDITY -> {
f_feucht = sensorEvent.values[0]
// f_wert = sensorEvent.values[0]
// txt_feuchttxt!!.text = String.format("%#.2f", f_wert) + "%"
}
}
}

override fun onAccuracyChanged(sensor: Sensor, i: Int) {}
override fun onResume() {
    super.onResume()
    sensorManager!!.registerListener(this, pressur, SensorManager.SENSOR_DELAY_NORMAL)
    sensorManager!!.registerListener(this, temp, SensorManager.SENSOR_DELAY_NORMAL)
    sensorManager!!.registerListener(this, feucht, SensorManager.SENSOR_DELAY_NORMAL)
}

override fun onDestroy() {
    sensorManager!!.unregisterListener(this)
    super.onDestroy()
}

}

Ist das so machbar oder gibt es einen besseren Weg. Was mich an meinem Programm stört, ist der Umstand, dass die Sensoren im Hintergrund dauernd gelesen werden.

Gruss Renato

Diskutiere mit!
Beste Antwort
  • Forum-Beiträge: 3.501

06.04.2020, 12:04:45 via Website

Speichere die Eventdaten temporär in eine Variable und baue dir dazu einen eigenen Minuten-Thread, der dann das aktuelle an deine Zielmimik übergibt ( ggf mit Listener)

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 11.012

06.04.2020, 11:56:32 via Website

Hallo Renato,

das wird nicht gehen, da du die Sensorwerte nur über die Events bekommst.
Du kannst natürlich den Event immer "unregister" und alle Minute wieder ein "register" machen, aber das ist nicht sinnvoll.
Zudem werden die Sensoren ja vom System sowieso gelesen und nicht nur von deiner App, du bekommst ja events wenn sich was ändert oder alle x ms. Aber da das System die Sensoren sowieso liest, (nehme ich an) ist das kein Problem.
Minutenwerte oder so müsstest du dir dann selber aus den Daten herauslesen,

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Diskutiere mit!
Beste Antwort
  • Forum-Beiträge: 3.501

06.04.2020, 12:04:45 via Website

Speichere die Eventdaten temporär in eine Variable und baue dir dazu einen eigenen Minuten-Thread, der dann das aktuelle an deine Zielmimik übergibt ( ggf mit Listener)

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 308

06.04.2020, 21:09:18 via Website

Danke für eure Antworten. So habe ich die Gewissheit, dass ich auf dem richtigen Weg bin. Ich mache es mit einem Händler welcher ich jede Minute aufrufe. Und das geht.

Gruss Renato

Hilfreich?
Diskutiere mit!
Empfohlene Artikel bei NextPit