0

嘿,我想在我的游戏中实现一个托管在新的 google play 开发者控制台中的排行榜。在本教程中,您必须使用BaseGameActivity. extends BaseGameActivity因为您不能扩展 2 个不同的类,所以我认为在找到其位置的地方创建另一个类是有意义的,这样我就可以在BaseGameActivity每次需要时从 MainActivity 调用它们(它扩展了 Activity,例如用于 UI 元素)。

我在 MainActivity 中调用登录函数:

public void onClick(View v) {       
        if (v.getId() == R.id.sign_in_button) {
              new Submit().signin();
        }

Submit是继承BaseGameActivity的类,方法signin()如下:

public  void signin()
{ beginUserInitiatedSignIn();}

如果我这样做,单击谷歌的登录按钮,我会收到以下错误(应用程序强制关闭):

07-02 02:34:35.491: E/AndroidRuntime(21287): java.lang.NullPointerException
07-02 02:34:35.491: E/AndroidRuntime(21287):    at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:131)
07-02 02:48:51.178: E/AndroidRuntime(21431): FATAL EXCEPTION: main
07-02 02:48:51.178: E/AndroidRuntime(21431): java.lang.NullPointerException
07-02 02:48:51.178: E/AndroidRuntime(21431):    at android.content.ContextWrapper.getPackageManager(ContextWrapper.java:116)
07-02 02:48:51.178: E/AndroidRuntime(21431):    at com.google.android.gms.common.GooglePlayServicesUtil.isGooglePlayServicesAvailable(Unknown Source)
07-02 02:48:51.178: E/AndroidRuntime(21431):    at com.google.example.games.basegameutils.GameHelper.beginUserInitiatedSignIn(GameHelper.java:445)
07-02 02:48:51.178: E/AndroidRuntime(21431):    at com.google.example.games.basegameutils.BaseGameActivity.beginUserInitiatedSignIn(BaseGameActivity.java:132)
07-02 02:48:51.178: E/AndroidRuntime(21431):    at PACKAGENAME.Submit.signin(Submit.java:25)
07-02 02:48:51.178: E/AndroidRuntime(21431):    at PACKAGENAME.APPNAME.MainActivity.onClick(MainActivity.java:181)

当我试图弄乱获取上下文或类似的东西时,会出现非常相似的错误。

我在另一个类中管理谷歌方法的想法是错误的,还是像那样无法撤消?如果没有,当我不扩展 Activity 因为我想扩展时,我应该如何管理 UI 元素BaseGameActivity

对不起,如果我的文字看起来很乱,但我现在已经坐在这个问题上 6 个小时了,我的眼睛现在正在流血..

谢谢您的回答

4

2 回答 2

0

这就是我所做的:

首先,我让示例应用程序(TypeANumber)工作。

然后我将谷歌代码松散地集成到我的应用程序中(当用户点击一个按钮然后以正常方式使用 BaseGameUtils 时,我只是启动了一个类似于 TypeANumber 的活动)。我认为,这就是您计划做的事情以及 Google 现在似乎建议您做事的方式(请参阅 https://developers.google.com/live/shows/5936979195723776)。

但是,您可能已经看到 BaseGameUtils 包含两个类 - BaseGameActivity 和 GameHelper。BaseGameActivity 是一段相对简单的代码,而 GameHelper 完成了大部分实际工作。在当时没有相反的指导的情况下,我只是编写了自己的 BaseGameActivity 版本以适应我现有的应用程序结构(操作栏选项卡/片段),将 GameHelper 复制到我的项目中,并设法让它在没有太多困难的情况下工作。当然,这种方法的一个优点是我不需要扩展 BaseGame...

我希望这有帮助。我已经看到您之前遇到的特定 NPE 错误 - 请检查您是否已在运行的设备/模拟器上安装了 Google Play 游戏服务(如果您使用的是模拟器 - 需要 Google API)。

于 2013-07-02T10:32:46.227 回答
0

我刚刚有一个类似的问题。我的解决方案是避免从不同的线程调用。BaseGameActivity 类中的某些方法似乎不是线程安全的。

在我使用此代码之前,我仅在大约 4 次尝试中的 1 次中获得了正确的行为:

public void signin(){
    //Run this code on the main thread.
    runOnUiThread(new Runnable() {      
        @Override
        public void run() {
            //Check if user is signed in
            if (!MainActivity.this.isSignedIn()){
                try{
                    //if not, attempt to sign in
                    beginUserInitiatedSignIn();
                }
                catch (Exception e) {
                    //Handle errors with an alert box
                    AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this); 
                    alert.setTitle("Unable to sign in");
                    alert.setMessage("The app was unable to sign in to G+. An error occured.");
                    alert.setPositiveButton("Ok", null);
                    alert.show();
                }
            }       
        }
    });
}

而不是这段代码:

public void signin(){
    beginUserInitiatedSignIn();
}

如果您使用其他线程,这可能只是解决方案。如果您不使用除主线程以外的任何线程,那么这不是解决方案。

大多数游戏将使用多个线程,因此这很可能是其他人遇到的问题。

- 编辑 -

尝试了一段时间后,我再次发现同样的问题。然而,有一个模式。如果手机方向发生变化,应用程序将无法正常登录。看来我实际上在我的应用程序中做了一些非常错误的事情。对我来说造成这种情况的原因是有一个指向主要活动实例的旧指针。游戏客户端有另一个不匹配的实例指针。

于 2014-05-02T15:36:11.523 回答