【Android】Google Play Game Servicesの実装【Android Studio】

Google Play Game Servicesの実装手順を示していきます。
結構私自身が時間がかかってしまったので他の方が少しでも短くなれば、っと思います。

開発環境はAndroidStudio 0.8.14です。

では、主な機能はIOSでいうところのGameCenter。
わからない方のためにいうと、
・実績
・リーダーボード（ランキング）
・イベント
などです。
今回はこれらの機能を使うための準備編です。
（ちなみに私はリーダーボード目当てで導入しました。）


では、早速。

# Developer Consoleでサービスのセットアップ

まだGoogleへのお布施（Developer登録）が済んでない人はしてください。

https://play.google.com/apps/publish/

![bandicam 2014-11-28 22-28-20-140.jpg](https://qiita-image-store.s3.amazonaws.com/0/59803/9af53a09-3840-bce1-0598-6d13bffb6874.jpeg)

コントローラーのマークに飛びます。
利用規約が全部で5つほどありますがすべてに同意してしまってください。
![02.png](https://qiita-image-store.s3.amazonaws.com/0/59803/dd8a27d4-22dd-f48d-6460-c0f609ab7ece.png)

利用規約に同意することでセットアップ画面に飛びます。

![03.png](https://qiita-image-store.s3.amazonaws.com/0/59803/924925dd-55c9-ba05-4206-8efc958b73c8.png)


サービスのセットアップを行います。



![bandicam 2014-11-28 22-32-07-942.jpg](https://qiita-image-store.s3.amazonaws.com/0/59803/1a23ab2f-6da1-c59d-35ef-b9d4f8d57759.jpeg)


名前とゲームカテゴリを選択して次へ。
今回はテスト用に適当な名前をつけておきましょう。

![bandicam 2014-11-28 22-34-17-627.jpg](https://qiita-image-store.s3.amazonaws.com/0/59803/35b35984-12b9-0956-2ada-931017628f79.jpeg)

この赤枠の中にAppIDが入っています。
いつでも見れるので特に控える必要はありません。

特に説明やアイコンなどは変更や追加する必要はありません。（テスト用ですので。）

次にアプリをリンクさせます。
単純にどのアプリで使用するか、ということです。
![bandicam 2014-11-28 22-37-54-108.jpg](https://qiita-image-store.s3.amazonaws.com/0/59803/12c05390-f4c3-79e6-2946-c3e489e5aea8.jpeg)

多分AndroidのAppで使用すると思うのでAndroidを選択。ちなみに他にはIOSやWeb,またUnityなどでも使用することができます。


Andoridを選択すると以下のような画面が出てきます。

Android![bandicam 2014-11-28 22-40-26-948.jpg](https://qiita-image-store.s3.amazonaws.com/0/59803/05723069-9081-5944-99df-86d4084de802.jpeg)

パッケージ名はAndroidStudioで作って上部にあるあれを打ち込んでください。

そのまま　「今すぐアプリを認証」を選択してください。

![bandicam 2014-11-28 22-43-34-190.jpg](https://qiita-image-store.s3.amazonaws.com/0/59803/fdec792a-62c0-1141-7b8a-1f9ca2862523.jpeg)

特に入力する場所はありません。
ProductLogoとHomePageURLは任意で。面倒であれば別にいいです。

![bandicam 2014-11-28 22-47-26-106.jpg](https://qiita-image-store.s3.amazonaws.com/0/59803/6039acd0-a6e8-f802-278e-3f481f25a131.jpeg)


## SHA1キーの出力方法
一番↓のSHA1キーの出力の仕方を説明します。

まずはJDKのBinの場所を。
大抵　C:\Program Files\Java\jdk1.8.0_05\bin　あたりにあるのではないでしょうか？
jdkのバージョンはそれぞれ。

ターミナルを表示してJDKの場所にディレクトリを移動させます。



cd "C:\Program Files\Java\jdk1.8.0_05\bin"


![bandicam 2014-11-28 22-53-28-501.jpg](https://qiita-image-store.s3.amazonaws.com/0/59803/afc1594a-7b71-4a2e-abda-582725f431ca.jpeg)

次にKeyStoreの場所を。

C:\Users\UserName\.android.\debug.keystore あたりにありそう。

そして先ほどのディレクトリを移動したターミナルで

keytool.exe -list -v -keystore "c:\Users\(UserName)\.android\debug.keystore"

と入力。
するとキーストアのパスワードを入力してください：と出ますが初期状態では無入力でEnterKeyで大丈夫です。

すると証明書のフィンガプリント：という項目に
SHA1というものがあると思うのでそれを控えてください。
多分今後も使うのでどこかに残していくといいかと。


これでGoogle Devのほうの設定は終わりです。

###　アプリに実装！！
退屈なセットアップは以上で終わり...とは行きません。SDK ManagerでまずはGoogle Play Servicesを導入します。


![bandicam 2014-11-28 23-05-39-033.jpg](https://qiita-image-store.s3.amazonaws.com/0/59803/28f48f43-5fa4-c762-5dc4-b44bf5f45406.jpeg)

チェックボックスにチェックがついてるやつをダウンロードしてください。

そしてAndroidStudioにインポートします。
素晴らしいことにすべてUIでできるようになっています。情報が古いものが多かったのでGradleに書き込んでいるものが多かったのですが、成長しています。

![bandicam 2014-11-28 23-07-36-521.jpg](https://qiita-image-store.s3.amazonaws.com/0/59803/6af04a4a-9b2a-093d-c4af-05399efd3a81.jpeg)


[File] -> [Project structure] 

ひだりのModulesにある[app]を選択。
上のメニューから[Dependencies]を選択。
右にある緑の＋ボタンをクリック

1.Library dipendency　を選択。

バージョンにより変わりますが、
com.android.support:support-v13:~~~~
com.google.android.gms:play-services:~~~~~
（先ほどダウンロードしたもの）を選択。
一番下のBaseGameUtilsはとりあえず放置で。

#### BaseGameUtilsの導入
ライブラリを追加します。
GitHubにGoogle Play Servicesのサンプルが公開されてるのでCloneするなりダウンロードするなりして入手します。
ちなみにサンプルは丁寧に書かれているので実装の手助けになると思います。（かなりお世話になりました。）


Google Play Servicesのサンプル：https://github.com/playgameservices/android-samples

私はデスクトップ上にBaseGameUtilsだけをコピーしました。
ライブラリをAndroidStudioにインポートします。一応方法を。



　[File] -> [Project structure] 

先ほどと同じ画面で今度は左上の緑＋ボタンを。
![bandicam 2014-11-28 23-18-13-739.jpg](https://qiita-image-store.s3.amazonaws.com/0/59803/a068dc18-fdd7-1e9c-85d4-f3185efdba99.jpeg)

左下あたりに存在する　▶More Modulesを選択
Import existing EclipseADTを選択。

BaseGameUtilsを選択。

Libを無事インポートできたらもう一度

　[File] -> [Project structure] 

そして今度は [app] -> [Dependencies]を再度選択　右上緑＋Buttonで今度は3(Module)を選択

[BaseGameUtils]を選択。

これでライブラリ導入等の前準備は完成。ついに開発できます。


##### GooglePlusにログインするための処理


ids.xmlを　res->valuesに作ります。


```xml:ids.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_id">YOUR_APP_ID</string>
</resources>
```

次にレイアウトを用意します。


```xml:activity_main.xml
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <com.google.android.gms.common.SignInButton
        android:id="@+id/button_sign_in"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/button_sign_out"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="サインアウト" />

</LinearLayout>

```

SignInButtonだけ何か特殊なものがあるな、っと思ったかもしれませんが
https://developers.google.com/+/branding-guidelines
ブランディングガイドラインでこれをつかえ、と設定されているようです。
深く考えずに使いましょう。


###### Activityの実装

```java:MainActivity.java

import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

import com.google.android.gms.common.SignInButton;
import com.google.example.games.basegameutils.BaseGameActivity;

public class MainActivity extends BaseGameActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

//ClickListener(SignInのための)の設定
        final SignInButton buttonSignIn = (SignInButton) findViewById(R.id.button_sign_in);
        buttonSignIn.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                Log.v("tag", "buttonSignIn click");
                beginUserInitiatedSignIn();
            }
        });
//ClickListener(SignOutのための）の設定
        final Button buttonSignOut = (Button) findViewById(R.id.button_sign_out);
        buttonSignOut.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                Log.v("tag", "buttonSignOut click");
                signOut();
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public void onSignInSucceeded() {
        Log.v("tag", "onSignInSucceeded");
        // SignInに成功したときの処理を以下に。
    }

    @Override
    public void onSignInFailed() {
        Log.v("tag", "onSignInFailed");
        // SignInに失敗したときの処理を以下に。
    }
}

```

特に難しいものはないと思いますが一応解説を。
BaseGameActivityをまずextends(継承）します。
あとは各種ClickLisnerによって
　成功->onSignInSucceeded()
　失敗->onSignInFailed()
が呼び出されます。


無事ログインできたら成功です。