2013-07-02 34 views
0

嘿,我想在我的遊戲中實現一個新的谷歌播放開發者控制檯託管的排行榜。在本教程中,您必須使用BaseGameActivity來擴展您的Activity類。因爲你不能擴展2個不同的類,所以我認爲在extends BaseGameActivity找到它的位置的時候創建另一個類是有意義的,所以我可以每次從我的MainActivity(擴展Activity,例如UI元素)需要它們時調用BaseGameActivityMainActivity中的android.gms.common.SignInButton?

我調用函數的符號在我的MainActivity:

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

提交的擴展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) 

當我試圖解決上下文或類似問題時,出現了類似的錯誤。

我的想法是管理其他類中的google方法錯誤,或者它甚至可以像那樣撤銷嗎?如果不是,當我不擴展活動時應如何管理UI元素,因爲我想擴展BaseGameActivity

很抱歉,如果我的文字看起來雜亂無章,但我現在在這個問題坐了6小時,我的眼睛都在流血現在..

謝謝你的答案

回答

0

這是我做過什麼:

首先,我得到了示例應用程序(TypeANumber)的工作。

然後,我將Google代碼鬆散地集成到我的應用程序中(當用戶點擊一個按鈕然後以常規方式使用BaseGameUtils時,我簡單地開始了一個類似TypeANumber的活動)。我認爲,這是你打算做的事情,以及Google現在似乎建議你做的事情的方式(請參閱 https://developers.google.com/live/shows/5936979195723776)。

但是,您可能已經看到BaseGameUtils包含兩個類--BaseGameActivity和GameHelper。 BaseGameActivity是一個相對簡單的代碼,GameHelper完成了大部分的實際工作。在當時缺乏相反指導的情況下,我只是編寫了我自己的BaseGameActivity版本,以適應我現有的應用程序結構(操作欄選項卡/片段)將GameHelper複製到我的項目中,並設法使其工作沒有太多困難。當然,這種方法的一個優點是我不需要擴展BaseGame ...

我希望這有助於。我已經看到您之前遇到的特定NPE錯誤 - 請檢查您是否在您正在運行的設備/仿真器上安裝了Google Play遊戲服務(如果您使用模擬器 - 需要Google API)。

+0

好吧我現在知道了BaseGameActivity包含了所有的Activity函數。不知何故,我的個人電腦和我第一次沒有弄清楚這一點。感謝您的提示,我會將其標記爲答案:)歡迎致電 – user2330482

+0

歡迎您。 – IanB

0

我剛剛有一個類似的問題。 我的解決方案是避免從不同的線程調用。 看來BaseGameActivity類中的某些方法不是線程安全的。

我正只在約1 4的嘗試正確的行爲,直到我用這個代碼:

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

這可能是唯一的解決辦法,如果你正在使用其他線程。如果你不使用主線程以外的任何線程,那麼這不是解決方案。

大多數遊戲將使用多個線程,因此這可能是其他人遇到的問題。

- 編輯 -

想那一陣子後,我再次找到了同樣的問題。 但是有一個模式。如果手機方向更改,則應用程序無法正確登錄。 它會出現我實際上在我的應用程序中做了非常錯誤的事情。 對我造成這種情況的是有一個指向主要活動實例的舊指針。遊戲客戶端有另一個不匹配的實例指針。