Android Studio中无法调用心率传感器问题求助
心率传感器无法读取数据的解决方案
针对光传感器正常工作但心率传感器无响应的问题,从权限、代码逻辑两方面给出修复方案:
1. 动态申请身体传感器权限
Android 6.0(API 23)及以上版本中,BODY_SENSORS属于危险权限,仅在Manifest中声明无法直接获取权限,必须在运行时主动申请。
权限申请逻辑
在MainActivity中添加权限检查与申请代码:
import android.content.pm.PackageManager; import android.os.Bundle; import android.widget.TextView; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import com.example.smartwatchprueba2.databinding.ActivityMainBinding; public class MainActivity extends Activity { private TextView mTextView, mTextView1; private ActivityMainBinding binding; private SensorManager sensorManager; private static final int REQUEST_BODY_SENSORS = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ActivityMainBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); mTextView = binding.textView; mTextView1 = binding.textView1; // 检查权限 if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.BODY_SENSORS) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.BODY_SENSORS}, REQUEST_BODY_SENSORS); } else { initSensors(); } } // 处理权限申请结果 @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_BODY_SENSORS) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { initSensors(); } else { mTextView1.setText("需授予身体传感器权限才能读取心率"); } } } // 初始化传感器 private void initSensors() { sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); Sensor sensorLuz = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); Sensor sensorRitmoCardiaco = sensorManager.getDefaultSensor(Sensor.TYPE_HEART_RATE); // 检查设备是否支持心率传感器 if (sensorRitmoCardiaco == null) { mTextView1.setText("当前设备不支持心率传感器"); return; } sensorManager.registerListener(listener, sensorLuz, SensorManager.SENSOR_DELAY_NORMAL); // 心率传感器使用更高的更新频率 sensorManager.registerListener(listener1, sensorRitmoCardiaco, SensorManager.SENSOR_DELAY_FASTEST); } SensorEventListener listener=new SensorEventListener() { @Override public void onSensorChanged(SensorEvent sensorEvent) { float value = sensorEvent.values[0]; mTextView.setText("当前光照强度: " + value + " lx"); } @Override public void onAccuracyChanged(Sensor sensor, int i) {} }; SensorEventListener listener1=new SensorEventListener() { @Override public void onSensorChanged(SensorEvent sensorEvent) { float value1 = sensorEvent.values[0]; // 修复控件覆盖问题,用mTextView1显示心率 mTextView1.setText("当前心率: " + value1); } @Override public void onAccuracyChanged(Sensor sensor, int i) {} }; @Override protected void onDestroy() { super.onDestroy(); if (sensorManager != null) { sensorManager.unregisterListener(listener); sensorManager.unregisterListener(listener1); } } }
2. 修复文本控件覆盖问题
原代码中心率回调错误使用了光传感器的显示控件mTextView,导致心率数据被光照数据覆盖,已改为使用mTextView1显示心率。
3. 额外注意事项
- 确保手表正确佩戴,心率传感器需要接触皮肤才能采集有效数据;
- 部分设备需在系统设置中单独开启应用的心率数据访问权限;
- 心率传感器建议使用
SENSOR_DELAY_FASTEST或SENSOR_DELAY_GAME的更新频率,SENSOR_DELAY_NORMAL可能无法及时获取数据。
内容的提问来源于stack exchange,提问作者lewis04
相关产品推荐
相关产品推荐

