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

