Java Google Play Games Android登录获取错误代码4

Java Google Play Games Android登录获取错误代码4,java,android,google-play-games,Java,Android,Google Play Games,我目前正在开发一款Android应用程序,我想在其中使用Google Play Games服务(成就、排行榜等)。经过多次迭代后,我终于得到了显示Google Play Games登录promt的代码。现在的问题是,用户登录后需要一段时间,抛出错误代码4,错误消息为空。在做了大量的研究之后,没有什么能真正帮助我解决这个问题 我尝试过直接从Android Studio启动它,手动或通过Google Play安装该应用程序,都是在多台设备上进行的,但没有任何效果 如果需要,这里有一些代码: 私有静

我目前正在开发一款Android应用程序,我想在其中使用Google Play Games服务(成就、排行榜等)。经过多次迭代后,我终于得到了显示Google Play Games登录promt的代码。现在的问题是,用户登录后需要一段时间,抛出错误代码4,错误消息为空。在做了大量的研究之后,没有什么能真正帮助我解决这个问题

我尝试过直接从Android Studio启动它,手动或通过Google Play安装该应用程序,都是在多台设备上进行的,但没有任何效果

如果需要,这里有一些代码:

私有静态GoogleSignInClient mGoogleSignInClient;
...
@凌驾
创建时受保护的void(Bundle savedInstanceState){
...
mGoogleSignInClient=GoogleSignIn.getClient(这是新的GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN).requestIdToken(getResources().getString(R.string.app_id)).build());
signessly();//还不能测试。
//isSignedIn()和logindeclied都是false
如果(!isSignedIn()&&!logindeclied)启动了点火();
}
...
私有无效启动信号(){
startActivityForResult(mgoogleSigningClient.getSigningent(),RC\u SIGN\u IN);
loginDeclined=真;
}
@凌驾
ActivityResult上受保护的void(int-requestCode、int-resultCode、Intent-Intent){
super.onActivityResult(请求代码、结果代码、意图);
//结果代码=0
if(requestCode==RC\u登录){
任务=
GoogleSignIn.GetSignedAccountFromIntent(intent);
试一试{
GoogleSignInAccount account=task.getResult(ApiException.class);
//现在这种情况永远不会发生:(
System.out.println(“成功!”);
}捕获(ApiException ApiException){
System.out.println(apiException.getStatusCode()+“+”+apiException.getMessage());
//状态代码为4,消息为“4:
String message=apiException.getMessage();
if(message==null | | message.isEmpty()){
message=“登录Google Play Games时出错”;
}
新建android.app.AlertDialog.Builder(此)
.setMessage(消息)
.setNeutralButton(android.R.string.ok,null)
.show();
}
}
}

请检查以下GPG登录问题的详细信息:

确保您已按照创建客户端ID和

清单中的元数据标记应与应用程序的数字ID匹配,并且只应包含数字。还应仔细检查您的包名。不要使用示例应用程序包名。请使用您自己的

您用于签署游戏的证书应与您的客户端ID关联的证书指纹匹配

最后一件重要的事情,检查测试帐户是否已启用。我总是忘记这一步

确保应用程序签名证书中的指纹与游戏服务中链接的应用程序相匹配。您还可以通过导航到Google API控制台->选择应用程序->凭据->OAuth 2.0客户端ID来验证这些详细信息

我注意到的另一件事是,如果应用程序已发布,则您需要从Play Store安装应用程序,以使这些凭据正常工作。如果应用程序尚未发布,请确保您使用的是调试指纹,并且与您的游戏服务相匹配(调试指纹)

只要你有这些指纹,你应该没事。如果你仍然有问题,我建议你通过代码实验室,逐步获得帮助,了解如何将现有的Unity游戏扩展到Android设备上运行并集成。

或以下是帮助快速测试的示例应用程序-


您还可以使用logcat帮助我们更好地了解问题。

确保使用SHA1

命令“keytool-list-keystore[path to debug keystore]”可能会显示SHA-256键

要获取您的SHA1密钥,您可以按照以下步骤操作:

  • 打开你的项目
  • 单击“Gradle”(右侧)
  • 选择你的模块
  • 任务->安卓->(双击)登录报告

  • 最近,当我试图使用保存的游戏api在他的硬盘上写入用户数据时,遇到了一个问题。我发现了这个问题。下面是我的观察结果,希望它能在一般情况下有所帮助:

  • 通过在游戏控制台中添加测试程序,可以在调试版本中测试play games api
  • 如果您想在已签名的apk上进行测试,那么您需要使用“app.keystore”密钥库文件生成SHA1密钥,并使用该应用程序特有的游戏服务中的SHA1密钥添加android应用程序。现在您将能够获得预期的结果。(这是我案例中的问题)
  • 如果要将数据存储在用户驱动器上,则需要在play game services中启用“saved games”api

  • 在互联网上搜索了数小时并检查了google play game services文档()中故障排除部分的每一步后,我填写了“OAuth同意屏幕”表格,最后它成功了。

  • 登录到Google Play控制台
  • 转到游戏服务
  • 去参加你的比赛吧
  • 在“游戏详细信息”页面上,向下滚动至链接的API控制台项目
  • 单击指向链接的API控制台项目的链接
  • 单击左侧栏中的“OAuth Conset屏幕”
  • 选择外部
  • 填写表格并上传图标
  • 送审

  • 之后,我的Google Play Game Services登录立即生效。

    我在Google Play Console gameservices项目中检查到的错误与使用相同的SHA1或不使用相同的SHA1以及
    private static GoogleSignInClient mGoogleSignInClient;
    
    ...
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
    
        mGoogleSignInClient = GoogleSignIn.getClient(this, new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN).requestIdToken(getResources().getString(R.string.app_id)).build());
    
        signInSilently(); // Can't be tested yet.
        // isSignedIn() and loginDeclined are both false
        if(!isSignedIn() && !loginDeclined) startSignInIntent();
    }
    
    ...
    
    private void startSignInIntent() {
        startActivityForResult(mGoogleSignInClient.getSignInIntent(), RC_SIGN_IN);
        loginDeclined = true;
    }
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
        super.onActivityResult(requestCode, resultCode, intent);
        // resultCode = 0
    
        if (requestCode == RC_SIGN_IN) {
            Task<GoogleSignInAccount> task =
                    GoogleSignIn.getSignedInAccountFromIntent(intent);
    
            try {
                GoogleSignInAccount account = task.getResult(ApiException.class);
                // Now this never happens :(
                System.out.println("SUCCESS!");
            } catch (ApiException apiException) {
                System.out.println(apiException.getStatusCode() + " + " + apiException.getMessage());
                // statusCode is 4, message is "4: "
    
                String message = apiException.getMessage();
                if (message == null || message.isEmpty()) {
                    message = "Error signing in to Google Play Games";
                }
    
                new android.app.AlertDialog.Builder(this)
                        .setMessage(message)
                        .setNeutralButton(android.R.string.ok, null)
                        .show();
            }
        }
    }