Android Studio中STEP_COUNTER传感器计步器无计数问题求助
解决Fragment中STEP_COUNTER传感器计步结果不显示的问题
核心问题排查与修复步骤:
补全必要权限(Android 10+必须)
Android 10及以上版本,使用TYPE_STEP_COUNTER传感器需要ACTIVITY_RECOGNITION权限。先在AndroidManifest.xml里添加声明:<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />然后在Fragment中动态申请权限,比如在
onCreateView里加权限检查:if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.ACTIVITY_RECOGNITION) != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{Manifest.permission.ACTIVITY_RECOGNITION}, 1001); } }修复日志输出,确认传感器回调
你当前的日志打印的是TextView对象,无法查看实际步数数据,改成打印真实步数:@Override public void onSensorChanged(SensorEvent event) { // 切到主线程更新UI,避免线程安全问题 requireActivity().runOnUiThread(() -> { int steps = (int) event.values[0]; String stepText = "重启后累计步数: " + steps; mStepsSinceReboot.setText(stepText); Log.d("Passi", stepText); }); }查看Logcat的
Passi标签,就能判断传感器是否正常返回数据。加固传感器注册逻辑
加一层空指针防护,避免生命周期问题导致的空对象异常:@Override public void onResume(){ super.onResume(); if (isSensorPresent && mSensorManager != null && mStepCounter != null) { mSensorManager.registerListener(this, mStepCounter, SensorManager.SENSOR_DELAY_NORMAL); } }验证布局控件状态
检查fragment_step.xml里的stepssincerebootTextView:- 确认id完全匹配(大小写敏感)
- 控件
visibility设置为visible - 文本颜色和背景色有足够对比度,避免内容看不见
修正后的完整Fragment代码:
public class StepFragment extends Fragment implements SensorEventListener { private SensorManager mSensorManager; private Sensor mStepCounter; private boolean isSensorPresent; private TextView mStepsSinceReboot; public StepFragment() { // Required empty public constructor } public static StepFragment newInstance(String param1, String param2) { StepFragment fragment = new StepFragment(); Bundle args = new Bundle(); fragment.setArguments(args); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_step, container, false); mStepsSinceReboot = v.findViewById(R.id.stepssincereboot); // Android 10+ 权限检查 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.ACTIVITY_RECOGNITION) != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{Manifest.permission.ACTIVITY_RECOGNITION}, 1001); } } mSensorManager = (SensorManager) requireActivity().getSystemService(Context.SENSOR_SERVICE); if (mSensorManager != null) { mStepCounter = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER); isSensorPresent = mStepCounter != null; } else { isSensorPresent = false; } return v; } @Override public void onSensorChanged(SensorEvent event) { requireActivity().runOnUiThread(() -> { int steps = (int) event.values[0]; String stepText = "重启后累计步数: " + steps; mStepsSinceReboot.setText(stepText); Log.d("Passi", stepText); }); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } @Override public void onResume(){ super.onResume(); if (isSensorPresent && mSensorManager != null && mStepCounter != null) { mSensorManager.registerListener(this, mStepCounter, SensorManager.SENSOR_DELAY_NORMAL); } } @Override public void onPause(){ super.onPause(); if (isSensorPresent && mSensorManager != null) { mSensorManager.unregisterListener(this); } } @Override public void onDestroy(){ super.onDestroy(); mSensorManager = null; mStepCounter = null; } // 处理权限申请结果 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 1001) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 权限授予后重新注册传感器 if (mSensorManager != null) { mStepCounter = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER); isSensorPresent = mStepCounter != null; if (isSensorPresent) { mSensorManager.registerListener(this, mStepCounter, SensorManager.SENSOR_DELAY_NORMAL); } } } } } }
内容的提问来源于stack exchange,提问作者Martina
相关产品推荐
相关产品推荐

