0

新しい Google Play デベロッパー コンソールでホストされているリーダーボードをゲームに実装したいと考えています。チュートリアルでは、Activity クラスを で拡張する必要がありますBaseGameActivity。2 つの異なるクラスを拡張することはできないため、extends BaseGameActivityその場所を見つける別のクラスを作成BaseGameActivityして、必要なときに MainActivity (UI 要素などの Activity を拡張する) から呼び出すことができるようにするのが理にかなっていると考えました。

MainActivity でサインイン関数を呼び出します。

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

Submit は BaseGameActivity を拡張するクラスで、メソッドsignin()は次のようになります。

public  void signin()
{ beginUserInitiatedSignIn();}

そのようにすると、Googleのサインインボタンをクリックすると、次のエラーが表示されます(アプリは強制的に閉じられます):

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メソッドを管理するという私の考えは間違っていますか、それともそのように元に戻すことさえできますか? そうでない場合、Activity を拡張したいために拡張していないときに、UI 要素をどのように管理すればよいBaseGameActivityですか?

私のテキストが乱雑に見える場合は申し訳ありませんが、私は今この問題に6時間座っていて、目が出血しています..

回答ありがとうございます

4

2 に答える 2

0

これは私がしたことです:

まず、サンプル アプリ (TypeANumber) が動作するようになりました。

次に、Google コードをアプリに大まかに統合しました (ユーザーがボタンをクリックすると、TypeANumber のようなアクティビティを開始し、通常の方法で BaseGameUtils を使用しました)。これは、あなたがやろうとしていることであり、Google があなたに推奨しているように見える方法だと思います ( https://developers.google.com/live/shows/5936979195723776を参照)。

ただし、BaseGameUtils が BaseGameActivity と GameHelper の 2 つのクラスで構成されていることはおそらくご存知でしょう。BaseGameActivity は比較的単純なコードであり、GameHelper が実際の作業のほとんどを行います。その時点で反対のガイダンスがなかったため、既存のアプリ構造 (アクション バー タブ/フラグメント) に適合する独自のバージョンの BaseGameActivity を作成し、GameHelper をプロジェクトにコピーし、それほど困難なく動作させることができました。もちろん、このアプローチの利点の 1 つは、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 に答える