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
相关产品推荐
相关产品推荐

