android studio传感器心率应用程序

时间:2016-11-07 18:35:27

标签: java android sensor heartbeat

我创建了一个简单的应用程序来学习如何使用一个按钮使用传感器心跳,这里的标签是我的代码:

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) {


    }

我添加到清单:

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

问题是没有调用onSensorChanged()。 我在这里检查了很多解决方案,但我没有找到任何东西

1 个答案:

答案 0 :(得分:2)

首先,如果你试图使用它的心率传感器,为什么你会要求它使用相机的权限?

其次,我认为当您点击“显示心率”时,您还没有来自传感器的任何数据(heartRateValue为空),最后数据来你不是真的更新UI,你只更新你的状态。我建议更新每个传感器更改的UI状态,例如:

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

或者你可以避免代码重复(甚至认为它只有一行),创建一个setter并从点击处理程序和传感器处理程序中调用它:

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);
    }
};

第三,您没有使用传感器中的数据,查看SensorEvent,数据来自values数组,您只是试图取代传感器类型,为什么?试试这个:

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