2013年8月4日日曜日

Google Play Game Servicesに自分のアプリを対応する

今年に入って、Googleが、ゲームのランキングや達成(アチーブメント)などを管理するAPIを公開してくださったようです。

Google Play Game Services - Take your games to the next level
https://developers.google.com/games/services/

嬉しいっ!

過去にも(今でも)こんなサービスやってる会社がいくつかありましたが、どっかに統合されたり、広告が出たりいろいろ問題ありました。

天下のGoogleが無料でこれを公開してくれれば鬼に金棒です。


そういうわけで、早速組み込みを行いました。



「論よりRUN(プログラムを実行)」といいます。(・・と最近は言いませんが)
まずはサンプルの実行です。
https://developers.google.com/games/services/android/quickstart

これは、それほど問題もなくできました。
基本的に英語力だけはそれなりに求められますが、最近は日本語の情報もあちこちあるので、そちらに譲るとします。

でも、、、

これを自分のアプリケーションに組み込むとなると、話は別でした。
Google Play Game Servicesに、自分のアプリケーションを対応させるのは、私はそれなりに苦労しました。


基本的なやりかたは、以下の通りなんです。

組み込み手順(英語)
Initializing Your Games Client in Android
https://developers.google.com/games/services/android/init


で、この通りやったのですが、なかなかうまくいきません。

自分のアプリの MainActivity.java の継承元クラスをActivity から BaseGameActivityクラスに変更するだけで、アプリの起動ができなくなってしまいます。

私は少しずつ修正して問題ないのを確認しながら進めていくタイプなので、ここで止まっていたのですが、他の設定を行わなければ起動できないという状況は改善されないことが、あとになってわかりました。

私の場合は、Google Play Game Services をEclipseにインストールした際、各種ライブラリがアップグレードされ、既存アプリのライブラリのバージョンの不一致による問題と、xmlファイルの設定不足が足かせだったみたいです。


私と同じようにうまくいかない方は、以下を参考に、ひとつずつ確認してみることをオススメします。
ほとんど自分用のメモですが、参考になれば幸いです。


■ビルドパスの調整
Eclipse パッケージエクスプローラで、自分のアプリのプロジェクトを
右クリック - プロパティ - Android
画面下部の「ライブラリ」に google-play-services、 BaseGameUtils  を追加
(Is Libraryにチェックをつけない)


■MainActivity.java に importを追加

import com.google.example.games.basegameutils.BaseGameActivity;


■MainActivity に、参照するクラスを追加

// 継承クラスを変更
before : public class MainActivity extends Activity
after  : public class MainActivity extends BaseGameActivity {


■必須メソッドの自動生成

  1. @Override
  2. public void onSignInFailed() {
  3. // TODO Auto-generated method stub
  4. }
  5. @Override
  6. public void onSignInSucceeded() {
  7. // TODO Auto-generated method stub
  8. }


■以下メソッドも追加
  1. // サインインチェック処理
  2. protected boolean isSignedIn() {
  3. return mHelper.isSignedIn();
  4. }
  5. // googleサインインボタン押下時
  6. @Override
  7. public void onSignInButtonClicked() {
  8. // start the sign-in flow
  9. beginUserInitiatedSignIn(); // サイン・イン
  10. }
  11. // googleサインアウトボタン押下時
  12. @Override
  13. public void onSignOutButtonClicked() {
  14. signOut(); // サインアウト
  15. }
  16. // ゲームクライアント取得
  17. protected GamesClient getGamesClient() {
  18. return mHelper.getGamesClient();
  19. }
  20. // 順位表示ボタン押下時処理
  21. @Override
  22. public void onShowLeaderboardsRequested() {
  23. if (isSignedIn()) {
  24. startActivityForResult(getGamesClient().getAllLeaderboardsIntent(), RC_UNUSED);
  25. } else {
  26. showAlert(getString(R.string.leaderboards_not_available));
  27. }
  28. }
  29. // 達成度表示ボタン押下時処理
  30. @Override
  31. public void onShowAchievementsRequested() {
  32. if (isSignedIn()) {
  33. startActivityForResult(getGamesClient().getAchievementsIntent(), RC_UNUSED);
  34. } else {
  35. showAlert(getString(R.string.achievements_not_available));
  36. }
  37. }

■AndroidManifest.xml の修正

 application セクション内
        <meta-data android:name="com.google.android.gms.games.APP_ID"
            android:value="@string/app_id" />


■ids.xml を記載(そういえば、私はこのファイルを今回初めて作りました)

app_id(Developer Consoleで確認) を、ids.xml に記載します。
その他、必要な値を設定します。
TypeANumberをコピーしてきて修正するのがオススメです。

 values\ids.xml を準備
    <string name="app_id">789779522XXX</string>


■android-support-v4.jar の最新化
既存のアプリに Google Play Game Services を組み込む場合、ライブラリのバージョンが上がっている場合があります。
その場合、ライブラリを新しくする必要があります。
私の場合、android-support-v4.jar が新しくなっていたので上書きコピー。

■レイアウトにログイン・ログアウトボタンを追加
これも TypeANumberを参考にするのがオススメです。
<!-- sign-in button -->
<com.google.android.gms.common.SignInButton
    android:id="@+id/sign_in_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
<!-- sign-out button -->
<Button
    android:id="@+id/sign_out_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Sign Out"
    android:visibility="gone" />   

■■■
ここまでで、ビルド・実行して、今までの処理が問題なく動くことを確認します。
動いたら、Developer Console の ゲームサービスから、自分のアプリを登録します。
登録の手順は、やっぱり TypeANumberを参考に。

そして、ようやくメインの処理の追記に入ります。

■スコア送信処理の追加
myLeaderBoard_ID : Developer Console の ゲームサービスで登録したときに取得したリーダーボードのID
myScore : 送信したい点数

  1. if (isSignedIn()) {
  2. getGamesClient().submitScore(myLeaderBoard_ID), myScore);
  3. }

■リーダーズボードの表示処理
  1. if (isSignedIn()) {
  2. startActivityForResult(getGamesClient().getAllLeaderboardsIntent(), RC_UNUSED);
  3. }

健闘を祈ります!


蛇足ですが、

私の場合は、project.propertiesも調整しました。手動編集しちゃいけないっぽかったですが、TypeANumberが動いたときの設定と比較した結果、差異があったので、直しちゃいました。

【修正前】
android.library.reference.1=../google-play-services_lib
android.library.reference.2=../BaseGameUtils

【修正後】
android.library.reference.1=../google-play-services_lib
android.library.reference.2=..\\BaseGameUtils


0 件のコメント:

コメントを投稿