You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中STEP_COUNTER传感器计步器无计数问题求助

解决Fragment中STEP_COUNTER传感器计步结果不显示的问题

核心问题排查与修复步骤:

  1. 补全必要权限(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);
        }
    }
    
  2. 修复日志输出,确认传感器回调
    你当前的日志打印的是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标签,就能判断传感器是否正常返回数据。

  3. 加固传感器注册逻辑
    加一层空指针防护,避免生命周期问题导致的空对象异常:

    @Override
    public void onResume(){
        super.onResume();
        if (isSensorPresent && mSensorManager != null && mStepCounter != null) {
            mSensorManager.registerListener(this, mStepCounter, SensorManager.SENSOR_DELAY_NORMAL);
        }
    }
    
  4. 验证布局控件状态
    检查fragment_step.xml里的stepssincereboot TextView:

    • 确认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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 06:45:37