2016-11-07 1 views
0

J'ai créé une application simple pour apprendre à utiliser des battements cardiaques du capteur avec un bouton et l'étiquette ici est mon code:capteur studio android fréquence cardiaque app

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


    } 

ajouter au manifeste:

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

le problème est que le onSensorChanged() n'est pas appelé. Je vérifie beaucoup de solutions ici, mais je n'ai rien trouvé

Répondre

1

Premièrement, pourquoi voudriez-vous qu'il demande des autorisations pour utiliser votre appareil photo si son capteur de rythme cardiaque que vous essayez d'utiliser? Deuxièmement, je pense qu'au moment où vous cliquez sur «Afficher le rythme cardiaque», vous n'avez pas encore de données du capteur (heartRateValue est vide), et lorsque les données arrivent enfin, vous ne mettez pas vraiment l'interface utilisateur à jour, vous seulement mettre à jour votre état. Ce que je suggère est de mettre à jour votre état de l'interface utilisateur sur chaque changement de capteur, par exemple:

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

ou vous pouvez éviter la duplication de code (même pensé la seule ligne), créer un setter et et l'appeler à la fois gestionnaire de clic et gestionnaire de capteur:

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

Troisièmement, vous n'utilisez pas les données de votre capteur, regardez SensorEvent, les données se décline en values tableau et vous essayez seulement de displat type de capteur, pourquoi? Essayez ceci:

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

j'attends comme 2 minutes en maintenant le doigt sur le capteur et me montrer nulle –

+0

@Sahar Vanunu modifié ma réponse, s'il vous plaît jeter un oeil –

+0

son encore nulle ... –