FirebaseAuthWithPlayGames致命异常:由java.lang.IllegalArgumentException引起的java.lang.RuntimeException给定的字符串为空或空

时间:2018-07-07 17:37:09

标签: firebase-authentication google-play-games

您好,我有使用Google Play游戏登录播放器的完整代码。请参见此代码段

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

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

2 个答案:

答案 0 :(得分:0)

我相信这是因为在Game Services和Firebase之间无法正确获取令牌

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

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

仔细检查以下步骤:

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

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

要找到这些值:

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

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

答案 1 :(得分:0)

我想我可能碰到了您之前遇到的完全相同的问题。我知道,自您提出问题以来已经过去了一年,但我希望它仍然可以为您或其他人提供帮助。

我正在将Firebase与我现有的具有Google Play游戏服务的游戏进行集成。我希望Firebase使用Play Games身份验证,但按照手册完成所有操作后,登录Firebase失败,并显示错误消息:给出的字符串为空或null

我发现实际上代码和集成设置都没有问题。 解决方案是,我只需要退出Google帐户并再次重新登录即可。

我认为,当我上次登录我的Google帐户和应用中的游戏服务时,还不存在有关Firebase集成设置的信息,因此我在手机上缓存的帐户对此一无所知完全没有重新登录刷新了缓存中的设置,以下authCode请求最终可以成功返回所需的字符串:

String authCode = signedInAccount.getServerAuthCode();