2016-11-07 3 views
0

Я создал простое приложение, чтобы узнать, как использовать датчик сердечного ритма с помощью одной кнопки и маркировать вот мой код:андроид студия датчик частоты сердечных сокращений приложение

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

Во-первых, почему вы ожидаете, что он попросит разрешения использовать вашу камеру, если ее датчик сердечного ритма вы пытаетесь использовать?

Во-вторых, я думаю, что к тому времени, когда вы нажмете «display heartrate», у вас просто нет данных от датчика (heartRateValue пуст), и когда данные наконец приходят, вы действительно не обновляете пользовательский интерфейс, вы только обновите свое состояние. То, что я предлагаю, чтобы обновить состояние пользовательского интерфейса на каждом изменении датчика, например: дублирования кода

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

или вы можете избежать (даже мысли его только одну строку), создать сеттер и и вызывать его из обоих обработчик щелчка и датчик обработчика:

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 массиве, и вы только пытаетесь displat тип датчика, почему? Попробуйте это:

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

я ждать, как 2 минуты держать палец на сенсоре и показать мне пустой –

+0

@Sahar Вануну отредактировал мой ответ, пожалуйста, посмотрите –

+0

его еще нулевой ... –

Смежные вопросы