【问题标题】:FirebaseAuthWithPlayGames Fatal Exception: java.lang.RuntimeException Caused by java.lang.IllegalArgumentException Given String is empty or nullFirebaseAuthWithPlayGames 致命异常:由 java.lang.IllegalArgumentException 引起的 java.lang.RuntimeException 给定字符串为空或 null
【发布时间】:2018-07-07 17:37:08
【问题描述】:

您好,我有一个完整的代码,用于通过 Google Play 游戏登录播放器。请参阅此代码 sn-p

 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();
        }
    }
}

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

【问题讨论】:

  • 最好把这段代码放在onConnected里面。但话虽如此,我得到了同样的错误。以下行返回 null AuthCredential credential = PlayGamesAuthProvider.getCredential(acct.getServerAuthCode());

标签: firebase-authentication google-play-games


【解决方案1】:

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

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

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

仔细检查这些步骤:

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

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

要找到这些值:

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

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

【讨论】:

    【解决方案2】:

    我想我可能刚刚遇到了与您之前遇到的完全相同的问题。我知道,距离您提出问题已经 1 年了,但我希望它仍然可以帮助您或其他人。

    我正在将 Firebase 与具有 Google Play 游戏服务的现有游戏集成。我希望 Firebase 使用 Play Games 身份验证,但在按照手册完成所有操作后,登录 Firebase 失败并显示错误消息:Given String is empty or null

    我发现实际上代码没有问题,集成设置也没有问题。 解决方案是我必须退出我的 Google 帐户并重新登录。

    我认为,当我上次在我的应用中登录我的 Google 帐户和游戏服务时,有关 Firebase 集成设置的信息尚不存在,因此我手机上的缓存帐户不知道它一点也不。重新登录刷新了缓存中的设置,下面的authCode请求终于可以成功返回需要的字符串了:

    String authCode = signedInAccount.getServerAuthCode();
    

    【讨论】:

      猜你喜欢
      • 2020-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-07
      • 1970-01-01
      • 2021-08-31
      • 1970-01-01
      相关资源
      最近更新 更多