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

WearOS应用在AVD修改传感器数值时无报错闪退求助

解决WearOS AVD修改虚拟传感器数值导致应用崩溃/最小化的问题

核心问题分析与解决方案

1. 权限与传感器注册时机不匹配

你的代码在onCreate中发起权限申请,但onResume直接注册传感器,存在权限未授予就执行注册的风险,且未处理权限申请的回调结果。修正逻辑:

  • 注册传感器前强制校验权限状态
  • 实现权限回调,在权限授予后再完成传感器注册

2. AVD虚拟传感器模块bug

部分旧版本WearOS AVD的虚拟传感器存在稳定性缺陷,修改数值时会触发系统异常。解决方法:

  • 更新WearOS AVD镜像至最新版本(推荐Wear OS 4)
  • 仅启用需要的传感器(如只保留心率传感器),关闭其他无关传感器减少冲突

3. 未捕获传感器数据异常

虚拟传感器返回的数值可能存在格式异常,未处理会直接导致应用崩溃。需在传感器回调中添加异常捕获逻辑。


修改后的完整代码示例

class MainActivity : ComponentActivity(), SensorEventListener{
    private lateinit var mSensorManager: SensorManager
    private var htSensor: Sensor? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            //mainScreen("ID usuario")
        }

        mSensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
        htSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_HEART_RATE)
        checkPermission(android.Manifest.permission.BODY_SENSORS, 100)
    }

    override fun onResume() {
        super.onResume()
        // 注册前验证权限与传感器可用性
        if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.BODY_SENSORS)
            == PackageManager.PERMISSION_GRANTED && htSensor != null
        ) {
            println("Heart rate sensor found and permission granted")
            mSensorManager.registerListener(this, htSensor, SensorManager.SENSOR_DELAY_NORMAL)
        } else {
            println("Permission denied or no heart rate sensor available")
        }
    }

    override fun onPause() {
        super.onPause()
        try {
            mSensorManager.unregisterListener(this)
        } catch (e: Exception) {
            // 避免重复注销引发异常
            e.printStackTrace()
        }
    }

    override fun onSensorChanged(p0: SensorEvent?) {
        try {
            p0?.let { event ->
                println("Heart rate updated: ${event.values[0]}")
            }
        } catch (e: Exception) {
            // 捕获数据异常,防止应用崩溃
            e.printStackTrace()
        }
    }

    override fun onAccuracyChanged(p0: Sensor?, p1: Int) {
        println("Heart rate sensor accuracy changed: $p1")
    }

    fun checkPermission(permission: String, requestCode: Int) {
        if (ContextCompat.checkSelfPermission(this, permission)
            == PackageManager.PERMISSION_DENIED
        ) {
            ActivityCompat.requestPermissions(this, arrayOf(permission), requestCode)
        }
    }

    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (requestCode == 100) {
            if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 权限授予后,若Activity处于前台则立即注册传感器
                if (isResumed) {
                    htSensor?.let {
                        mSensorManager.registerListener(this, it, SensorManager.SENSOR_DELAY_NORMAL)
                    }
                }
            } else {
                println("Body sensors permission denied, cannot access heart rate data")
            }
        }
    }
}

额外建议

  • 若使用Compose开发,建议用DisposableEffect管理传感器注册,绑定Compose组件生命周期,避免Activity与Compose生命周期冲突
  • 若AVD问题持续,优先用真实WearOS设备测试,虚拟传感器稳定性远不如实体设备

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 07:28:19