You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

WearOS设备无法连接Google Fitness API权限问题咨询

解决WearOS上Google Fitness API心率数据记录的权限问题

嘿,我来帮你搞定这个WearOS连接Google Fit记录心率的权限问题!从你贴的代码来看,确实有几个可以优化和排查的点,咱们一步步来:

1. 简化FitnessOptions的配置

你现在重复调用了两次.addDataType来添加读写权限,其实可以合并成一行,避免潜在的配置冗余问题:

fitnessOptions = FitnessOptions.builder()
    .addDataType(DataType.TYPE_HEART_RATE_BPM, FitnessOptions.ACCESS_READ | FitnessOptions.ACCESS_WRITE)
    .build();

2. 确保权限请求流程正确

WearOS上请求Google Fit权限必须通过Google Sign-In来完成,而且现在推荐用Jetpack的Activity Result API替代旧的onActivityResult,这里给你一个标准的请求流程示例:

首先在Activity里初始化权限请求合约:

private final ActivityResultLauncher<Intent> requestFitPermissionsLauncher = registerForActivityResult(
    new ActivityResultContracts.StartActivityForResult(),
    result -> {
        if (result.getResultCode() == Activity.RESULT_OK) {
            GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this);
            // 检查权限是否成功获取
            if (GoogleSignIn.hasPermissions(account, fitnessOptions)) {
                // 权限已获取,可以开始处理心率数据
                startRecordingHeartRate();
            } else {
                // 权限被拒绝,提示用户
                Toast.makeText(this, "需要Google Fit权限才能记录心率", Toast.LENGTH_SHORT).show();
            }
        }
    }
);

然后在需要请求权限的时候调用:

GoogleSignInAccount account = GoogleSignIn.getAccountForExtension(this, fitnessOptions);
if (!GoogleSignIn.hasPermissions(account, fitnessOptions)) {
    requestFitPermissionsLauncher.launch(
        GoogleSignIn.requestPermissions(
            this,
            REQUEST_FIT_PERMISSIONS,
            account,
            fitnessOptions
        )
    );
} else {
    // 已经有权限,直接开始操作
    startRecordingHeartRate();
}

3. 检查AndroidManifest的必要配置

千万别漏了这些关键配置,否则权限请求会失败:

  • 添加活动识别权限(心率数据需要这个):
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />
  • 声明Google Play服务版本:
<meta-data
    android:name="com.google.android.gms.version"
    android:value="@integer/google_play_services_version" />

4. 验证WearOS设备的环境

  • 确保手表上的Google Play服务是最新版本,旧版本可能存在API兼容性问题;
  • 确认手表已登录和手机相同的Google账号,并且Google Fit应用在手机和手表上都已正常配置。

5. 测试心率数据写入的正确性

当权限确认没问题后,你可以用RecordingClient来自动订阅心率数据(让Google Fit后台自动记录):

private void startRecordingHeartRate() {
    GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this);
    Fitness.getRecordingClient(this, account)
        .subscribe(DataType.TYPE_HEART_RATE_BPM)
        .addOnSuccessListener(unused -> {
            // 订阅成功,心率数据会自动同步到Google Fit
            Toast.makeText(this, "开始记录心率", Toast.LENGTH_SHORT).show();
        })
        .addOnFailureListener(e -> {
            // 订阅失败,打印错误信息排查
            Log.e("FitError", "订阅心率失败: " + e.getMessage());
        });
}

如果是手动写入心率数据点,可以用HistoryClient:

private void insertHeartRateData(long bpm) {
    GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this);
    // 构建数据点
    DataPoint dataPoint = DataPoint.builder(fitnessOptions.getDataType(DataType.TYPE_HEART_RATE_BPM))
        .setTimestamp(System.currentTimeMillis(), TimeUnit.MILLISECONDS)
        .setFloatValues(bpm)
        .build();
    DataSet dataSet = DataSet.builder(dataPoint.getDataType())
        .add(dataPoint)
        .build();
    // 写入数据
    Fitness.getHistoryClient(this, account)
        .insertData(dataSet)
        .addOnSuccessListener(unused -> Log.d("FitSuccess", "心率数据写入成功"))
        .addOnFailureListener(e -> Log.e("FitError", "写入失败: " + e.getMessage()));
}

按照这些步骤排查和调整,应该就能解决权限相关的问题啦!

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

火山引擎 最新活动