Java 如何从Android Wear读取心率

Java 如何从Android Wear读取心率,java,android,Java,Android,我需要读取用户当时的心率。我尝试使用我在Wear项目中主要活动中的代码 public class MainActivity extends WearableActivity implements SensorEventListener { private static final String TAG = "MainActivity"; private TextView mTextViewHeart; SensorManager mSensorManager;

我需要读取用户当时的心率。我尝试使用我在Wear项目中主要活动中的代码

public class MainActivity extends WearableActivity implements SensorEventListener { private static final String TAG = "MainActivity"; private TextView mTextViewHeart; SensorManager mSensorManager; Sensor mHeartRateSensor; SensorEventListener sensorEventListener; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextViewHeart = (TextView) findViewById(R.id.heart); mSensorManager = ((SensorManager) getSystemService(SENSOR_SERVICE)); mHeartRateSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_HEART_RATE); mSensorManager.registerListener(this, mHeartRateSensor, SensorManager.SENSOR_DELAY_NORMAL); Log.i(TAG, "LISTENER REGISTERED."); mTextViewHeart.setText("Something here"); mSensorManager.registerListener(sensorEventListener, mHeartRateSensor, mSensorManager.SENSOR_DELAY_FASTEST); } public void onResume(){ super.onResume(); } public void onAccuracyChanged(Sensor sensor, int accuracy) { Log.d(TAG, "onAccuracyChanged - accuracy: " + accuracy); } public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() == Sensor.TYPE_HEART_RATE) { String msg = "" + (int)event.values[0]; mTextViewHeart.setText(msg); Log.d(TAG, msg); } else Log.d(TAG, "Unknown sensor type"); } } 公共类MainActivity扩展WearableActivity实现SensorEventListener{ 私有静态最终字符串TAG=“MainActivity”; 私有文本视图mTextViewHeart; 传感器管理器; 传感器MHeartratesesensor; SensorEventListener SensorEventListener; @凌驾 创建时受保护的void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextViewHeart=(TextView)findViewById(R.id.heart); msSensorManager=((SensorManager)getSystemService(传感器服务)); mHeartRateSensor=msSensorManager.getDefaultSensor(传感器类型\心率); msSensorManager.registerListener(此,mHeartRateSensor,SensorManager.SENSOR\u DELAY\u正常); Log.i(标记“LISTENER REGISTERED.”); mTextViewHeart.setText(“此处的某物”); msSensorManager.registerListener(sensorEventListener、mHeartRateSensor、msSensorManager.SENSOR\u DELAY\u FASTEST); } 恢复时公开作废(){ super.onResume(); } 精度更改时的公共无效(传感器,int精度){ Log.d(标记“onAccuracyChanged-精度:”+精度); } 传感器更改时的公共无效(传感器事件){ if(event.sensor.getType()==sensor.TYPE\u心率){ 字符串msg=”“+(int)事件值[0]; mTextViewHeart.setText(msg); Log.d(标签、消息); } 其他的 Log.d(标签“未知传感器类型”); } } 这段代码根本不起作用,给了我一个错误提示:

E/SensorManager﹕ sensor or listener is null 电子/传感器管理器﹕ 传感器或侦听器为空 如果我使用除心率传感器以外的任何其他设备,它都可以正常工作

我正在使用:

  • LG G4,android API级别23
  • LG Urbane手表(我知道它有一个心率传感器),磨损API等级为23

谢谢你的帮助。

我遇到了你在书中看到的同样的问题。我们有相同的穿戴设备,所以我几乎可以肯定,您在wear AndroidManifest.xml上错过了这个

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

此外,您应该转到“设置”中的“权限”,以检查该权限是否已启用


您可以在上检查我的项目,该项目目前正在运行。

实际上您正在实现SensorEventListener接口,并创建了一个SensorEventListener实例,而无需对其进行初始化

初始化传感器:

SensorEventListener sensorEventListener = new SensorEventListener(){ ... };
或者将其移除并使用“this”:

将其更改为:

mSensorManager.registerListener(this, mHeartRateSensor, mSensorManager.SENSOR_DELAY_FASTEST);

别忘了,从SDK 23开始,您必须分别在穿戴设备和手机上请求权限。Wear应用程序不再从手机应用程序继承权限


权限问题已经让我有好几次措手不及了。虽然我还没有实现请求使用传感器许可的代码,但一个简单的解决方法是进入可穿戴设备的设置,然后选择许可并找到您的应用程序。当你点击你的应用程序时,你会注意到传感器被禁用,所以只要点击它就可以启用它们。那就行了

试试这个问题……你好!我确实在我的穿着清单上得到了许可,但它不起作用。。。我会检查你的项目。非常感谢。您知道如何从传感器向传感器传递数据吗adb@prathamkesarkar你好很抱歉迟了答复。我没有试过,所以我帮不了你。其他智能手表也有同样的解决方案:华为、索尼和华硕。仅使用mSensorManager.registerListener(此,mHeartRateSensor,mSensorManager.SENSOR\u DELAY\u最快);天啊!我真的花了两个小时来反对这个。我不是java开发人员,所以我认为我做错了什么。不,应用程序只需要设置中的权限。我确实在AndroidManifest.xml中添加了权限,我认为这就足够了。
mSensorManager.registerListener(this, mHeartRateSensor, mSensorManager.SENSOR_DELAY_FASTEST);