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

三星Z Flip(SM-F711N)升级后Sensor.TYPE_STEP_COUNTER为null求助

三星SM-F711N升级Android 13/ONE UI后Step Counter传感器返回null的问题排查与解决

问题概述

我开发的计步应用采用Sensor.TYPE_STEP_COUNTER传感器实现步数追踪,在多款测试设备上运行正常,但三星SM-F711N机型升级ONE UI和Android 13后出现异常:通过packageManager.hasSystemFeature(PackageManager.FEATURE_SENSOR_STEP_COUNTER)检测到设备支持该传感器特性,但调用mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER)返回null,getSensorList也无法获取到对应传感器实例。

日志代码及逻辑如下:

Log.e("test","hasSystemFeature - SENSOR-STEP-COUNTER" + packageManager.hasSystemFeature(PackageManager.FEATURE_SENSOR_STEP_COUNTER));

Log.e("test","step sensor list: ${mSensorManager.getSensorList(Sensor.TYPE_STEP_COUNTER)}")
Log.e("test", "step counter default sensor: ${mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER)}" )

可能原因

  1. 权限策略变更:三星在Android 13/ONE UI更新中收紧了传感器访问权限,TYPE_STEP_COUNTER的访问不再仅依赖硬件特性,还需要ACTIVITY_RECOGNITION权限,旧版本中可能无需显式申请,导致权限缺失后无法获取传感器。
  2. 系统传感器服务异常:系统升级过程中传感器服务可能出现初始化缓存问题,导致传感器列表未正确加载。
  3. 三星定制系统限制:ONE UI对计步类传感器做了特殊管控,即使硬件支持,也可能因系统层面的开关未开启导致应用无法访问。

解决办法

  • 补充并申请ACTIVITY_RECOGNITION权限
    首先在AndroidManifest.xml中声明权限:

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

    针对Android 10及以上系统,需要动态申请该权限,获取权限后再尝试获取传感器:

    private const val REQUEST_ACTIVITY_RECOGNITION = 1001
    
    // 检查并申请权限
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACTIVITY_RECOGNITION) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACTIVITY_RECOGNITION), REQUEST_ACTIVITY_RECOGNITION)
    } else {
        // 权限已授予,获取传感器
        initStepSensor()
    }
    
    // 权限回调处理
    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (requestCode == REQUEST_ACTIVITY_RECOGNITION && grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            initStepSensor()
        }
    }
    
    private fun initStepSensor() {
        val stepCounterSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER)
        stepCounterSensor?.let {
            // 注册传感器监听
            mSensorManager.registerListener(this, it, SensorManager.SENSOR_DELAY_NORMAL)
        }
    }
    
  • 备选使用Sensor.TYPE_STEP_DETECTOR
    如果TYPE_STEP_COUNTER仍无法获取,可切换到Sensor.TYPE_STEP_DETECTOR作为替代。该传感器每检测到一步就触发一次事件,应用需自行累计步数并持久化存储(重启后计数会重置):

    val stepDetectorSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR)
    stepDetectorSensor?.let {
        mSensorManager.registerListener(this, it, SensorManager.SENSOR_DELAY_NORMAL)
    }
    
    // 传感器回调中累计步数
    override fun onSensorChanged(event: SensorEvent?) {
        event?.takeIf { it.sensor.type == Sensor.TYPE_STEP_DETECTOR }?.let {
            currentStepCount += 1
            // 持久化步数到SharedPreferences或数据库
        }
    }
    
  • 重置传感器服务
    引导用户重启设备,或重启应用,可解决系统传感器服务初始化异常导致的传感器列表加载失败问题。

  • 检查三星设备专属权限设置
    部分ONE UI版本中,计步权限被归类到“身体活动”权限下,需引导用户进入「设置 → 应用 → 你的应用 → 权限」,确认“身体活动”权限已开启。

内容的提问来源于stack exchange,提问作者Seokang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 11:16:01