首页 > 解决方案 > FirebaseAuthWithPlayGames 致命异常:由 java.lang.IllegalArgumentException 引起的 java.lang.RuntimeException 给定字符串为空或 null

问题描述

您好,我有一个完整的代码,用于通过 Google Play Games 登录玩家。请参阅此代码片段

 GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN)
            .requestServerAuthCode("720182182679-fv285c7k5kecqhqdmc9ggc9f73jc9hef.apps.googleusercontent.com")
            .build();

    mGoogleSignInClient = GoogleSignIn.getClient(start.this, gso);


    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addApi(Games.API)
            .addScope(Games.SCOPE_GAMES)
            .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
            .build();




 private void startSignInIntent() {
    GoogleSignInClient googleSignInClient = GoogleSignIn.getClient(this, GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN);
    Intent intent = googleSignInClient.getSignInIntent();
    startActivityForResult(intent, RC_SIGN_IN);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == RC_SIGN_IN) {
        GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
        if (result.isSuccess()) {

            // The signed in account is stored in the result.
            GoogleSignInAccount signedInAccount = result.getSignInAccount();
            assert signedInAccount != null;
            Toast.makeText(start.this, "Google Play Games Connectet", Toast.LENGTH_SHORT).show();

        } else {

            String message = result.getStatus().getStatusMessage();
            new AlertDialog.Builder(this).setMessage(message)
                    .setNeutralButton(android.R.string.ok, null).show();
        }
    }
}

上面的代码完美地工作。但是如果我想触发以下方法,游戏就会崩溃,并让我得到标题中的错误。

private void firebaseAuthWithPlayGames(GoogleSignInAccount acct) {
    Log.d(TAG, "firebaseAuthWithPlayGames:" + acct.getId());
    AuthCredential credential = PlayGamesAuthProvider.getCredential(acct.getServerAuthCode());
    mAuth.signInWithCredential(credential)
            .addOnCompleteListener(this, task -> {
                if (task.isSuccessful()) {
                    // Sign in success, update UI with the signed-in user's information
                    Log.d(TAG, "signInWithCredential:success");
                    FirebaseUser user = mAuth.getCurrentUser();
                    updateUI(user);
                } else {
                    // If sign in fails, display a message to the user.
                    Log.w(TAG, "signInWithCredential:failure", task.getException());
                    Toast.makeText(start.this, "Authentication failed.",
                            Toast.LENGTH_SHORT).show();
                    updateUI(null);
                }

                // ...
            });
}

我通过在 startSignInIntent 的 on ActivityResult 中调用它来触发此方法,如下所示:

   @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == RC_SIGN_IN) {
        GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
        if (result.isSuccess()) {

            // The signed in account is stored in the result.
            GoogleSignInAccount signedInAccount = result.getSignInAccount();
            assert signedInAccount != null;
   --------->   firebaseAuthWithPlayGames(signedInAccount);   <-----------
            Toast.makeText(start.this, "Google Play Games Connectet", Toast.LENGTH_SHORT).show();

        } else {

            String message = result.getStatus().getStatusMessage();
            new AlertDialog.Builder(this).setMessage(message)
                    .setNeutralButton(android.R.string.ok, null).show();
        }
    }
}

我希望有人遇到过这个问题并且可以提供帮助。

标签: firebase-authenticationgoogle-play-games

解决方案


我相信这是因为它没有在游戏服务和 Firebase 之间正确获取令牌

您必须在 Play 控制台中配置链接到同一游戏的 Web 应用程序。然后从 Web 应用程序复制客户端 ID 并将其粘贴到插件的设置对话框中。

步骤在这里...... https://firebase.google.com/docs/auth/android/play-games

仔细检查以下步骤:

启用 Google Play Games 作为登录提供商:

查找项目的 Web 服务器客户端 ID 和客户端密码。Web 服务器客户端 ID 向 Google Play 身份验证服务器标识您的 Firebase 项目。

要找到这些值:

在 Google API 控制台凭据页面中打开您的 Firebase 项目。在 OAuth 2.0 客户端 ID 部分中,打开 Web 客户端(由 Google 服务自动创建)详细信息页面。此页面列出了您的 Web 服务器客户端 ID 和密码。然后,在 Firebase 控制台中,打开身份验证部分。

在登录方法选项卡上,启用 Play Games 登录提供程序。您需要指定您从 API 控制台获得的项目的 Web 服务器客户端 ID 和客户端密码。


推荐阅读