首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FirebaseAuthWithPlayGames致命异常:由java.lang.IllegalArgumentException引起的java.lang.RuntimeException给定字符串为空或为null

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

Stack Overflow用户
提问于 2018-07-08 01:37:09
回答 1查看 202关注 0票数 1

你好,我有一个完整的工作代码,通过谷歌游戏登录在球员登录。请参阅此代码片段

代码语言:javascript
复制
 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();
        }
    }
}

上面的代码工作得很好。但如果我想触发下面的方法,游戏就会崩溃,并在标题中显示错误。

代码语言:javascript
复制
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);
                }

                // ...
            });
}

代码语言:javascript
复制
   @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();
        }
    }
}

我希望有人已经面对了这个问题,并能提供帮助。

EN

回答 1

Stack Overflow用户

发布于 2018-07-26 07:59:37

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

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

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

仔细检查以下步骤:

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

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

要查找这些值:

在Google API控制台凭证页面中打开Firebase项目。在Web2.0client IDs部分,打开OAuth client (由Google Service自动创建)详细信息页面。此页列出您的web服务器客户端ID和密码。然后,在Firebase控制台中,打开Authentication部分。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51225519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档