如何在Android健康应用中从Wear OS设备获取步数数据?
从Wear OS设备获取步数数据并在Android应用展示的实现步骤
1. 配置项目依赖与权限
- 在手机端和Wear端的Module级别
build.gradle中添加依赖:dependencies { implementation 'com.google.android.gms:play-services-fitness:21.0.1' implementation 'com.google.android.gms:play-services-wearable:18.1.0' } - 两个端的
AndroidManifest.xml中添加必要权限:
注意:Android 10及以上版本需动态申请<!-- 步数读取核心权限 --> <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" /> <uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION" /> <!-- 后台持续获取需添加 --> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />ACTIVITY_RECOGNITION权限。
2. 完成Google Fit授权流程
不管是手机还是Wear设备,都需先通过Google账号完成Fit服务授权:
- 初始化Fitness配置,指定步数数据的读取权限:
val fitnessOptions = FitnessOptions.builder() .addDataType(DataType.TYPE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_READ) .addDataType(DataType.AGGREGATE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_READ) .build() - 检查授权状态,未授权则发起请求:
val account = GoogleSignIn.getAccountForExtension(context, fitnessOptions) if (!GoogleSignIn.hasPermissions(account, fitnessOptions)) { GoogleSignIn.requestPermissions( activity, REQUEST_FIT_PERMISSIONS, // 自定义请求码,比如1001 account, fitnessOptions ) } else { // 已授权,开始获取步数数据 fetchStepData(account) }
3. 获取步数数据的两种核心场景
场景1:Wear设备本地读取实时/历史步数
如果Wear应用独立运行,可直接在Wear端调用Fit API读取数据:
private fun fetchStepData(account: GoogleSignInAccount) { // 构建读取请求,这里以读取最近1天的步数为例 val stepCountRequest = DataReadRequest.Builder() .aggregate(DataType.TYPE_STEP_COUNT_DELTA, DataType.AGGREGATE_STEP_COUNT_DELTA) .bucketByTime(1, TimeUnit.DAYS) .setTimeRange(System.currentTimeMillis() - 86400000, System.currentTimeMillis(), TimeUnit.MILLISECONDS) .build() Fitness.getHistoryClient(context, account) .readData(stepCountRequest) .addOnSuccessListener { response -> var totalSteps = 0 response.buckets.forEach { bucket -> bucket.dataSets.forEach { dataSet -> totalSteps += calculateTotalSteps(dataSet) } } // 拿到步数后更新Wear端UI updateWearStepUI(totalSteps) } .addOnFailureListener { // 处理读取失败逻辑 } } private fun calculateTotalSteps(dataSet: DataSet): Int { var steps = 0 dataSet.dataPoints.forEach { point -> point.dataType.fields.forEach { field -> steps += point.getValue(field).asInt() } } return steps }
场景2:通过数据层同步Wear步数到手机应用
如果需要在手机应用展示Wear端的步数,用Wear数据层实现跨设备同步:
- Wear端发送步数数据:
private fun syncStepsToPhone(totalSteps: Int) { val dataMap = DataMap().apply { putInt("KEY_TOTAL_STEPS", totalSteps) } val request = PutDataMapRequest.create("/step-sync") .setDataMap(dataMap) .setUrgent() // 优先同步,确保数据即时传输 Wearable.getDataClient(context) .putDataItem(request.asPutDataRequest()) .addOnSuccessListener { // 同步成功回调 } } - 手机端监听数据变化:
class StepSyncListener : DataClient.OnDataChangedListener { override fun onDataChanged(dataEvents: DataEventBuffer) { dataEvents.forEach { event -> if (event.type == DataEvent.TYPE_CHANGED && event.dataItem.uri.path == "/step-sync") { val dataMap = DataMapItem.fromDataItem(event.dataItem).dataMap val syncedSteps = dataMap.getInt("KEY_TOTAL_STEPS") // 更新手机应用UI updatePhoneStepUI(syncedSteps) } } } } // 在手机应用启动时注册监听 Wearable.getDataClient(context).addListener(StepSyncListener())
4. 后台持续获取步数(可选)
如果需要Wear端后台持续统计步数,需创建前台服务并绑定Fit传感器监听:
private fun startStepSensor(account: GoogleSignInAccount) { val sensorRequest = SensorRequest.Builder() .setDataType(DataType.TYPE_STEP_COUNT_DELTA) .setSamplingRate(1, TimeUnit.SECONDS) .build() Fitness.getSensorsClient(context, account) .add(sensorRequest, object : OnDataPointListener { override fun onDataPoint(dataPoint: DataPoint) { dataPoint.dataType.fields.forEach { field -> val stepDelta = dataPoint.getValue(field).asInt() // 更新本地步数统计,同步到手机 updateLocalStepCount(stepDelta) } } }) }
内容的提问来源于stack exchange,提问作者user21166051
相关产品推荐
相关产品推荐

