请求Google Play Games API游戏权限范围时ResultCode为0的问题求助
解决Google Play Games API权限请求失败的问题
我来帮你排查这个Google Play Games API权限请求的问题,结合你的描述和代码片段,下面是几个关键的排查和解决步骤:
1. 核对Google Cloud & Play Console的核心配置
这是最容易出问题的环节,很多权限请求失败都源于配置不匹配:
- 确保你在代码中使用的Server Client Id是Google Cloud Console中Web应用类型的客户端ID,而非Android客户端ID(
requestServerAuthCode和requestIdToken都需要Web类型的ID) - 检查Google Play Console中,你的应用是否已正确关联对应的Google Cloud项目,并且启用了Google Play Games服务
- 进入Google Cloud Console的OAuth同意屏幕设置,确认已勾选游戏相关的权限范围(比如
games权限),如果是测试阶段,务必将测试设备的Google账号添加到测试用户列表中
2. 修正GoogleSignInOptions的构建逻辑
虽然DEFAULT_GAMES_SIGN_IN应该包含必要的游戏权限范围,但显式声明权限有时能解决隐式配置的问题,修改你的代码如下:
// 显式定义游戏权限范围 Scope gamesScope = new Scope("https://www.googleapis.com/auth/games"); GoogleSignInOptions gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN) .requestIdToken("你的Web类型Server Client Id") .requestServerAuthCode("你的Web类型Server Client Id") .requestEmail() .requestScopes(gamesScope) // 显式添加游戏权限 .build(); GoogleSignInClient mGoogleSignInClient = GoogleSignIn.getClient(this, gso); // 启动登录流程 startActivityForResult(mGoogleSignInClient.getSignInIntent(), RC_SIGN_IN);
3. 再次验证签名证书指纹
即使你重新签名了,也需要确认以下两点:
- 用于构建APK的密钥库的SHA-1指纹(包括debug和release版本)已经添加到Google Cloud Console对应的Android客户端ID中
- 如果你的应用使用了Google Play应用签名(App Signing by Google Play),需要将Google Play Console中显示的发布证书指纹也添加到Cloud Console的客户端ID配置里
4. 确保Google Play Games服务初始化正常
在发起登录请求前,先验证Play Games服务的可用性,避免因服务未就绪导致的权限问题:
// 检查Play Games服务是否可用 GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance(); int resultCode = apiAvailability.isGooglePlayServicesAvailable(this); if (resultCode != ConnectionResult.SUCCESS) { if (apiAvailability.isUserResolvableError(resultCode)) { // 提示用户修复服务问题 apiAvailability.getErrorDialog(this, resultCode, 9000).show(); } else { Toast.makeText(this, "设备不支持Google Play Games服务", Toast.LENGTH_SHORT).show(); } return; } // 服务可用,再启动登录流程 startActivityForResult(mGoogleSignInClient.getSignInIntent(), RC_SIGN_IN);
5. 排查登录回调的错误信息
在登录结果回调中捕获具体错误,能精准定位问题:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RC_SIGN_IN) { Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data); try { GoogleSignInAccount account = task.getResult(ApiException.class); // 登录成功后,初始化Games客户端 Games.getGamesClient(this, account).signIn(); } catch (ApiException e) { // 打印错误码和详情,常见错误码: // 12500:客户端ID/指纹不匹配;10:用户拒绝授权;7:Play服务版本过低 Log.e(TAG, "登录失败,错误码: " + e.getStatusCode() + ",详情: " + e.getMessage()); } } }
先从配置层面入手排查,这往往是问题的根源,再逐步验证代码和服务状态,应该能解决权限请求失败的问题。
内容的提问来源于stack exchange,提问作者TheJoeIaut
相关产品推荐
相关产品推荐

