Google Play Services授权异常:Fitness权限撤销后silentSignIn仍可调用
解决Google Fitness静默授权在权限撤销后仍返回成功的问题
我之前开发Fitness相关功能时也碰到过一模一样的坑——这本质是Play Services客户端库会缓存本地的授权状态,哪怕用户在网页端撤销了权限,本地缓存没更新的话,silentSignIn()还是会返回成功。下面是几个经过验证的解决思路:
1. 先清除本地缓存再执行静默授权
在调用silentSignIn()之前,先调用clearDefaultAccountAndReconnect()清除本地缓存并重新和服务端同步,这样就能拿到最新的权限状态:
GoogleSignInClient signInClient = GoogleSignIn.getClient(context, myFitSignInOptions); // 先清除本地缓存并重新连接服务端 signInClient.clearDefaultAccountAndReconnect() .addOnCompleteListener(task -> { if (task.isSuccessful()) { // 再执行静默授权 signInClient.silentSignIn() .addOnCompleteListener(silentTask -> { if (silentTask.isSuccessful()) { // 授权状态有效,正常调用Fitness API } else { // 权限已被撤销,需要引导用户重新走授权流程 } }); } else { // 重新连接失败,处理异常情况 } });
2. 主动验证Fitness的实际权限
就算silentSignIn()返回成功,也别直接默认权限有效,主动调用Fitness的权限检查接口确认:
// 假设已经拿到了GoogleSignInAccount实例 Fitness.getPermissionsClient(context, googleSignInAccount) .listPermissions() .addOnCompleteListener(permissionTask -> { if (permissionTask.isSuccessful()) { Set<Scope> grantedScopes = permissionTask.getResult().getGrantedScopes(); // 检查你需要的Fitness Scope是否在授权列表里 boolean hasActivityScope = grantedScopes.contains(new Scope(Scopes.FITNESS_ACTIVITY_READ)); if (!hasActivityScope) { // 权限已被撤销,触发重新授权逻辑 } } });
3. 监听账户权限变更的广播
注册广播接收器,监听Google账户的权限变更事件,一旦收到通知就主动重新验证授权状态:
BroadcastReceiver permissionChangeReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (GoogleSignInApi.ACTION_SIGN_IN_CHANGED.equals(intent.getAction())) { // 账户登录状态或权限发生变更,重新检查授权 checkAuthStatus(); } } }; // 在合适的地方注册广播(比如Activity的onCreate) IntentFilter filter = new IntentFilter(GoogleSignInApi.ACTION_SIGN_IN_CHANGED); context.registerReceiver(permissionChangeReceiver, filter);
记得在页面销毁时注销广播接收器,避免内存泄漏。
重要提醒
silentSignIn()的成功只代表本地缓存的登录状态有效,不会实时同步网页端的权限撤销操作。所以最佳实践是:每次调用Fitness核心API前,都做一次权限有效性校验,不要完全依赖静默授权的结果。
内容的提问来源于stack exchange,提问作者stan0
相关产品推荐
相关产品推荐

