Java Android-创建一个简单的心率监视器

Java Android-创建一个简单的心率监视器,java,android,android-sensors,Java,Android,Android Sensors,我有一个三星galaxy S7,我想在触摸式心脏传感器上(将手机放在靠近摄像头的位置),应用程序读取心率并将其显示在文本视图中 我试过了,但没用 我的活动 import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorManager; import android.support.v7.app.AppCompatActivity; import android.

我有一个三星galaxy S7,我想在触摸式心脏传感器上(将手机放在靠近摄像头的位置),应用程序读取心率并将其显示在文本视图中

我试过了,但没用

我的活动

import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.hardware.SensorEventListener;
import android.util.Log;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements SensorEventListener{
    public TextView testoLabel;
    private static final String TAG = "MyActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.e(TAG, "onCreate called");

        testoLabel = (TextView) findViewById(R.id.testoLabel);

       SensorManager sMgr;
        sMgr = (SensorManager)this.getSystemService(SENSOR_SERVICE);

        Sensor battito = null;
        battito = sMgr.getDefaultSensor(Sensor.TYPE_HEART_RATE);
        if(battito != null)
            testoLabel.setText("load sensor");
        else
            testoLabel.setText("no load sensor");

        sMgr.registerListener(this, battito,SensorManager.SENSOR_DELAY_NORMAL);

    }
    @Override
    public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() == Sensor.TYPE_HEART_RATE) {
            String msg = " Value sensor: " + (int)event.values[0];
            testoLabel.setText(msg);
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        System.out.println("onAccuracyChanged - accuracy: " + accuracy);
    }
}
AndroidMainfest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.giuseppeaccardo.prova" >
    <uses-permission android:name="android.permission.BODY_SENSORS" />

    <application

        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >
        <activity android:name=".MainActivity" >
            <uses-permission android:name="android.permission.BODY_SENSORS" />

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

您不能,因为如果您不使用SDK,三星不允许这样做。如果你想使用他们的SDK,你必须申请许可。更多信息请访问

您需要三星健康SDK来访问这些传感器


我不确定你是否可以访问它,但这是使用正确传感器的官方文档

您可以尝试更改此选项:

sMgr.registerListener(this, battito,SensorManager.SENSOR_DELAY_NORMAL);
为此:

 sMgr.registerListener(this, battito,SensorManager.SENSOR_DELAY_FASTEST);
这会增加它读取手指的时间

您需要做的最后一件事是确保正确允许权限。我看到您已经在清单中允许了它,但是您还需要在运行时允许它。请看这个以寻求帮助


否则,如前所述,请添加有关您的问题的更多详细信息

我认为您的问题在于身体传感器的许可。我建议您检查用户是否授予body sensors权限,然后初始化心率传感器,如果是,请继续,否则请请求用户授予权限。即使您在清单中添加了“使用身体传感器”权限,这也适用

if (checkSelfPermission(Manifest.permission.BODY_SENSORS)
            != PackageManager.PERMISSION_GRANTED) {
        requestPermissions(new String[]{Manifest.permission.BODY_SENSORS},
                PERMISSIONS_REQUEST_BODY_SENSORS);
} else {
        //Your code for declaring and initializing Sensor manager and Heartrate sensor
};

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,
                                       int[] grantResults) {
    if (requestCode == PERMISSIONS_REQUEST_BODY_SENSORS
            && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
         //Your code for declaring and initializing Sensor manager and Heartrate sensor
    }
}

这里没有足够的信息继续下去。您至少需要调试它并发布logcat traceok…但是代码运行,但手机的心脏传感器无法检测到触摸