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

如何在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中添加必要权限:
    <!-- 步数读取核心权限 -->
    <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" />
    
    注意:Android 10及以上版本需动态申请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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 09:27:41