2013 年 5 月 1 日

アンドロイドアプリからGoogle+にログインしてみる(後編)

アンドロイドアプリからGoogle+にログインしてみる(後編)

グーメン2。

前回はGoogle+のログインを実装するまえの準備として、OAuth Client IDを作成しました。
今回はログインサンプルアプリを作成していきます。

前編の「アンドロイドアプリからGoogle+にログインしてみる(前編)」も参照しながら、読んでください。

ライブラリインポート

EclipseのバージョンはJuno Service Release 2を利用しています。
まずはWorkSpaceにgoogle-play-service_libをインポートします。
File->New->Project…Android Project from Existing Codeから、
android-sdks/extras/google/google_play_service_libを開きます。

アプリプロジェクトを作成

次に、サンプルアプリのプロジェクトを作成します。名前は何でもいいですが、パッケージ名は前回設定したパッケージ名を利用し、API Level16以上をターゲットにします。

プロジェクトが作成できたら、プロジェクトのプロパティからさきほどのライブラリを追加しておきます。

これでコーディングの準備が整いました。

AndroidManifest.xml

Google Play Services Rev.12から、manifestのapplicationタグに以下のメタデータが必要になったようです(13/11/13)。

<meta-data
  android:name="com.google.android.gms.version"
  android:value="@integer/google_play_services_version" />

インターフェース

MainActivityクラスに次のインターフェースを追加します。

public class MainActivity extends Activity 
  implements ConnectionCallbacks, OnConnectionFailedListener {

このインタフェースを実装すると以下のメソッドを実装する必要があります。

  @Override
  public void onConnectionFailed(ConnectionResult arg0) {
    // TODO Auto-generated method stub
    
  }
  /**
   * Bundle arg0が追加されたようです(GooglePlayServices rev.12で確認 13/11/10)。
    */
  @Override
  public void onConnected(Bundle arg0) {
    // TODO Auto-generated method stub
    
  }

  @Override
  public void onDisconnected() {
    // TODO Auto-generated method stub
    
  }

定数・変数

次に必要な定数やメンバ変数を追加します。

  private static final int REQUEST_CODE_RESOLVE_ERR = 9000;
  private static final String[] SCOPES = {
    Scopes.PLUS_LOGIN
  };

  private static final String[] VISIBLE_ACTIVITIES = {
    "http://schemas.google.com/AddActivity", "http://schemas.google.com/ReviewActivity"
  };

  private PlusClient mClient = null;
  private ProgressDialog mDialog = null;
  private ConnectionResult mResult = null;

初期化

次にGoogle+クライアントを初期化するコードを作成します。
setScopes(SCOPES)はログインのみなら必要ないと思います。

これをonCreateで呼んでおきます。

Google Play Services rev.12以前

private void initGooglePlus() {
  mClient = new PlusClient.Builder(this, this, this)
              .setScopes(SCOPES)
              .setVisibleActivities(VISIBLE_ACTIVITIES).build();
}

Google Play Services rev.12

private void initGooglePlus() {
  mClient = new PlusClient.Builder(this, this, this)
              .setScopes(SCOPES)
              .setActions(VISIBLE_ACTIVITIES).build();
}

rev.12で確認すると、setVisibleActivitiesはundefinedになっていて、setActionsを利用するようです。activityという名前は混乱するので、actionの方がわかりやすいです(13/11/13)。

ログイン

次にログインメソッドを作成します。

  private void loginGooglePlus() {
    mDialog = new ProgressDialog(this);
    mDialog.setMessage("Signing in...");
  }

コネクションハンドラー

後は、コネクションハンドラーを実装します。getAccountNameメソッドを利用する場合、Manifestに次のパーミッションが必要です。

<uses-permission android:name="android.permission.GET_ACCOUNTS" />

これを忘れるとSecurityExceptionが発生します。

  @Override
  public void onConnected(Bundle arg0) {
    mDialog.dismiss();
    String accountName = mClient.getAccountName();
    // このacccountNameにてアカウントの有無を調べて、なければ新規登録処理へ、あればログイン処理へ
    Log.d(TAG, accountName + " is connected.");
  }
  
  @Override
  public void onDisconnected() {
    Log.d(TAG, "google plus disconnected.");
    
  }
  
  @Override
  public void onConnectionFailed(ConnectionResult result) {
    Log.d(TAG, "google plus connection failed.");
    if (result.hasResolution()) {
      try {
          result.startResolutionForResult(this, REQUEST_CODE_RESOLVE_ERR);
      } catch (SendIntentException e) {
        mClient.connect();
      }
    }
    // Save the result and resolve the connection failure upon a user click.
    mResult = result;    
  }

実行

後は、loginGooglePlusメソッドを呼び出すだけです。

通常は、ログインボタンを表示して、ボタンがクリックされたらloginGooglePlusメソッドを実行することになります。

プログラムを起動して、しばらくすると次のような画面が表示されるので、OKボタンをクリックします。

その後、元のプログラムに戻って、アカウント名をトーストで表示します。

ログインしたまま、アプリを起動し、ログインメソッドを実行すると、すぐにonConnectedハンドラが呼び出しされます。

ログアウト

このサンプルでは利用していませんが、ログアウト処理は以下のようにします。本来のアプリなら、ログアウトボタンは必ずつける方がよいでしょう。

private void logoutGooglePlus() {
  mClient.clearDefaultAccount();
  // cliearDefalutAction()を呼んでから、disconnectする。
  mClient.revokeAccessAndDisconnect(new OnAccessRevokedListener() {
    @Override
    public void onAccessRevoked(ConnectionResult status) {
    }
 });
}

これでアンドロイドアプリからGoogle+へログインすることができました。

みなさんのアプリでも、Google+でログインできるようにしてみてください。