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

Android端请求查询Google Fit睡眠数据的正确权限申请方式是什么?

com.google.android.gms.common.api.ApiException: 4 本质是调用接口时没有有效登录的Google账号,或账号未授予接口所需的授权范围,你的现有代码只申请了步数所需的基础权限,缺少睡眠数据所需的额外配置,具体解决方案如下:

  • 补全Google Fit授权范围
    睡眠数据不属于SCOPE_ACTIVITY_READ的覆盖范围,你需要额外申请睡眠专属授权范围:如果使用旧版Fit API,需要申请Fitness.SCOPE_ACTIVITY_READ_WRITE;如果使用2020年之后更新的Fit API,需要申请专门的Fitness.SCOPE_SLEEP_READ(只读)或Fitness.SCOPE_SLEEP_READ_WRITE(读写)。
    同时要确保你初始化GoogleSignInOptions时就已经添加了对应的睡眠scope,否则后续授权流程无法正确获取权限。
  • 增加登录态有效性校验
    你现有代码中直接使用的acct变量可能存在过期、为空的情况,调用接口前必须先校验当前是否存在有效登录的Google账号:
    调用GoogleSignIn.getLastSignedInAccount(context)判断账号是否存在,再调用GoogleSignIn.hasPermissions()判断账号是否已经授予睡眠数据所需的scope,两个条件都满足才能调用睡眠查询接口。
  • 修正权限申请逻辑
    给你修改后的参考代码:
    首先是GoogleSignIn初始化代码:
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            // 同时添加步数和睡眠所需的scope
            .requestScopes(Fitness.SCOPE_ACTIVITY_READ, Fitness.SCOPE_SLEEP_READ)
            .build();
    GoogleSignInClient signInClient = GoogleSignIn.getClient(this, gso);
    
    然后是权限申请逻辑:
    // 1. 先校验运行时权限
    if (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.ACTIVITY_RECOGNITION)
            != PackageManager.PERMISSION_GRANTED) {
        String[] permissions = {Manifest.permission.ACTIVITY_RECOGNITION};
        requestPermissions(permissions, ACTIVITY_RECOGNITION_REQUEST_CODE);
        return;
    }
    // 2. 校验Google账号登录态和scope授权
    GoogleSignInAccount signedInAccount = GoogleSignIn.getLastSignedInAccount(getContext());
    if (signedInAccount == null || !GoogleSignIn.hasPermissions(signedInAccount, Fitness.SCOPE_SLEEP_READ)) {
        GoogleSignIn.requestPermissions(
                this,
                GOOGLE_FITNESS_SCOPE_REQUEST_CODE,
                signedInAccount,
                Fitness.SCOPE_ACTIVITY_READ,
                Fitness.SCOPE_SLEEP_READ
        );
        return;
    }
    // 到这里就可以正常调用睡眠数据查询接口
    
  • 排查后台配置问题
    如果以上修改完成后还是报错,检查Google Cloud控制台的配置:确认你已经开启了Google Fitness API,且当前应用的签名SHA1、包名和控制台OAuth 2.0客户端ID的配置完全一致,debug和release环境的签名要分开配置,避免签名不匹配导致权限被拒绝。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 05:27:03