谷歌+登录时出现“未知错误” - 谷歌玩游戏服务

3
我正在尝试实现Google Play游戏服务,我的应用程序主菜单上有一个Google+登录按钮。当用户尝试登录时,他们会通过整个登录过程(5个或更多屏幕),直到我认为它正在完成登录,然后出现以下错误。

dsf

这个问题出现在我的测试手机上,我也可以在AVD模拟器上重现。错误信息显然有点模糊。我已经尝试了此处链接中的所有解决方案,但都没有成功。
有人能帮我吗?我不确定您需要哪些代码,但我已经发布了我MainMenu类的相关片段。

MainMenu.class

public class MainMenu extends BaseGameActivity {

    DatabaseHelper dh;

    ImageView image;
    Button startBtn, highscoresBtn, aboutBtn, comingsoonBtn, biblestudyBtn, signOut;

    SignInButton sign_in_button;
    TextView title, subtitle;

    public static final String notice = "notice";

    GamesClient client;

    Context c;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mainmenu);

        client = getGamesClient();
        client.connect();

        c = this;

        sign_in_button = (SignInButton)findViewById(R.id.sign_in_button);
        signOut = (Button)findViewById(R.id.sign_out_button); 
        startBtn = (Button)findViewById(R.id.startBtn);
        highscoresBtn = (Button)findViewById(R.id.highscoresBtn);
        aboutBtn = (Button)findViewById(R.id.aboutBtn);
        comingsoonBtn = (Button)findViewById(R.id.comingsoonBtn);
        biblestudyBtn = (Button)findViewById(R.id.biblestudyBtn);
        title = (TextView)findViewById(R.id.title);
        subtitle = (TextView)findViewById(R.id.subtitle);

        startBtn.setText(c.getResources().getString(R.string.startBtn));
        highscoresBtn.setText(c.getResources().getString(R.string.highscoresBtn));
        aboutBtn.setText(c.getResources().getString(R.string.aboutBtn));
        comingsoonBtn.setText(c.getResources().getString(R.string.comingsoonBtn));
        biblestudyBtn.setText(c.getResources().getString(R.string.biblestudyBtn));
        title.setText(c.getResources().getString(R.string.title));
        subtitle.setText(c.getResources().getString(R.string.subtitle));
        //sign_in_button.setText(c.getResources().getString(R.string.signin));
        signOut.setText(c.getResources().getString(R.string.signout));

        sign_in_button.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                // start the asynchronous sign-in flow
                beginUserInitiatedSignIn();
            }
        });

        signOut.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                // sign-out
                signOut();

                // show sign-in button, hide the sign-out button
                findViewById(R.id.sign_in_button).setVisibility(View.VISIBLE);
                findViewById(R.id.sign_out_button).setVisibility(View.GONE);
            }
        });
    }

    public void onSignInSucceeded() {
        // show sign-out button, hide the sign-in button
        findViewById(R.id.sign_in_button).setVisibility(View.GONE);
        findViewById(R.id.sign_out_button).setVisibility(View.VISIBLE);

        final Dialog dialog = new Dialog(c);
        dialog.setContentView(R.layout.importlayout);
        dialog.setTitle(R.string.importtitle);

        TextView question = (TextView)dialog.findViewById(R.id.question);       
        Button save = (Button)dialog.findViewById(R.id.save);
        Button scratch = (Button)dialog.findViewById(R.id.scratch);

        question.setText(c.getResources().getString(R.string.importquestion));
        save.setText(c.getResources().getString(R.string.savebtn));
        scratch.setText(c.getResources().getString(R.string.scratchbtn));

        save.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {

                //...
            }
        });

        scratch.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                dh.deleteAll();
                for(int i = 0; i < 15; i++) {
                    dh.insert(0, 0, "-");
                }
                dialog.dismiss();
                dh.closeDB();
            }
        });

        dialog.show();
    }

    public void onSignInFailed() {
        // sign in has failed. So show the user the sign-in button.
        findViewById(R.id.sign_in_button).setVisibility(View.VISIBLE);
        findViewById(R.id.sign_out_button).setVisibility(View.GONE);

        // (add any code if needed)
    }
}

编辑

我尝试过:

  • 确保SHA1/证书指纹正确

编辑 #2

刚刚注意到一件事。我需要点击“发布游戏”才能让所有这些开始工作吗?

此外,我需要先将APK导出并上传到开发者控制台中吗?

enter image description here


你能发布“adb logcat”的输出吗? - cbrulak
@cbrulak - 当我在截图中的窗口上点击“确定”时,该窗口只是消失了,然后回到我的应用程序。在LogCat中没有显示任何错误信息。 - Matt
4个回答

1
我认为Google Play自动选择的证书指纹不正确。尝试在Google APIs控制台上删除您的应用程序客户端ID,取消链接您的应用程序,然后使用正确的证书指纹重新链接它。正确的指纹在Eclipse中导出应用程序时显示。

我认为你说得对,Google Play 自动选择了错误的证书指纹。我删除了 Google APIs 控制台中的应用程序和客户端 ID,并取消了应用程序的链接。我重新做了一遍并设置好了一切,但它仍然尝试自动选择错误的 SHA1/证书指纹。我输入了正确的指纹。所以这可能是一个我以后会发现的问题,但不幸的是,即使清理、重建和重新启动 AVD,我仍然遇到相同的错误。感谢你帮忙解决这个问题,但我仍然遇到相同的错误。 - Matt
1
Google Play不会自动选择证书指纹。窗口中显示的只是一个示例。 - Bruno Oliveira
我会移除示例SHA1。在我看来,它只会引起混淆。 - Angelo Tricarico
7个月后,我重新尝试实现登录功能,第一次就成功了。我注意到本次教程中有几个不同之处,使它们更加清晰易懂(例如,在这种情况下明确标记SHA1作为示例)。 - Matt

1
谷歌应用商店不会自动选择指纹。你在窗口中看到的是一个示例指纹,旨在展示指纹的外观。你应该使用keytool命令来获取自己的指纹,例如:
keytool -exportcert -alias your-key-name -keystore /path/to/your/keystore/file -list -v

如果您的密钥是调试密钥,那么your-key-name通常会是androiddebugkey

好的,很高兴知道 @BrunoOliveira!你似乎是Android/Google团队的一员。对于"未知错误"有什么想法吗? - Matt
我认为谷歌应用商店错误地从上传的 APK 中检索指纹。好知道。 - Hartok

0

如果您正在以调试模式运行应用程序,即使用调试证书而不是发布证书进行签名,请确保您还已经使用此SHA1配置了应用程序(您可以为相同的包名称添加第二个链接应用程序)。

同时确保您的测试人员在测试人员列表中。

运行“adb logcat”将非常有帮助。


0

在我意识到程序有问题后,这似乎对我来说是显而易见的,但请确保您登录的帐户是开发人员列表中列出的帐户或测试下的测试人员列表中列出的帐户。在测试多人游戏时,其他玩家的 Google Plus 帐户也必须列为测试人员。

在开发者控制台中从 Google Play 游戏服务选择游戏时,测试会列在6个选项中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接