简体   繁体   中英

android studio sensor HEART Rate app

I created a simple app to learn how to use sensor heart beat with one button and label here is my code:

public class MainActivity extends AppCompatActivity implements SensorEventListener {
    Button show;
    TextView showHeartRate;
    SensorManager sensorMgr;
    Sensor heartRate;
    String heartRateValue;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        show = (Button) findViewById(R.id.button);
        show.setOnClickListener(displayHeartRate);
        showHeartRate = (TextView) findViewById(R.id.showHeartRate);
        sensorMgr = (SensorManager)this.getSystemService(SENSOR_SERVICE);
        heartRate = sensorMgr.getDefaultSensor(Sensor.TYPE_HEART_RATE);

    }
    View.OnClickListener displayHeartRate = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            showHeartRate.setText(heartRateValue);

        }
    };

    @Override
    protected void onResume() {
        super.onResume();
    sensorMgr.registerListener(this,heartRate,SensorManager.SENSOR_DELAY_NORMAL);

    }

    @Override
    protected void onPause() {
        super.onPause();
        sensorMgr.unregisterListener(this);
    }

    @Override
    public void onSensorChanged(SensorEvent sensorEvent) {
        heartRateValue = Integer.toString(sensorEvent.sensor.getType());

    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int i) {


    }

I add to the manifest:

<uses-permission android:name="android.permission.BODY_SENSORS"/>

the problem is that the onSensorChanged() is not called. i check a lot of solutions here but i did not find anything

First, why would you expect it to ask permissions to use your camera if its heartrate sensor that you are trying to use?

Second, I think by the time you click 'display heartrate', you just don't have any data from the sensor yet ( heartRateValue is empty), and when data finally comes you don't really update UI, you only update your state. What I suggest is to update your UI state on every sensor change, for example:

    @Override
        public void onSensorChanged(SensorEvent sensorEvent) {
            heartRateValue = Integer.toString(sensorEvent.sensor.getType());
            showHeartRate.setText(heartRateValue);
        }

or you can avoid code duplication (even thought its only one line), create a setter and and call it from both click handler and sensor handler:

private void setHeartrate(String rate) {
     showHeartRate.setText(rate);
}

@Override
public void onSensorChanged(SensorEvent sensorEvent) {
     heartRateValue = Integer.toString(sensorEvent.sensor.getType());
     setHeartrate(heartRateValue);
}

View.OnClickListener displayHeartRate = new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        setHeartrate(heartRateValue);
    }
};

Third, you are not using data from your sensor, look at SensorEvent , data comes in values array and you are only trying to displat sensor type, why? Try this:

@Override
        public void onSensorChanged(SensorEvent sensorEvent) {
            heartRateValue = Integer.toString(sensorEvent.values.length > 0 ? sensorEvent.values[0] : 0.0f);
            showHeartRate.setText(heartRateValue);
        }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM