AndroidでFacebookの認証を行う(実装編)


前回AndroidでFacebookの認証を行う(準備編)では、AndroidでFacebookの認証を行うために必要なSDKのダウンロードやAPIキーの取得、SDKをAndroidのプロジェクトに組み込む方法などについて解説しました。
今回はその続きで、認証を行う部分のソースコードについて解説します。(上記リンクにて準備を済まされていることを前提としています)

Facebookのログイン認証はFacebook Android SDKを用いることで、比較的簡単な実装でログインまで行うことができます。

また解説中でも触れますが、AndroidにおけるFacebookの認証は、Android用のFacebook公式アプリケーションFacebook for Androidが端末にインストールされているかどうかで多少動きが変わってきます。どのように違ってくるのかについても簡単に触れていきたいと思います。

それでは続きで詳しく見ていきます。

ログイン画面を実装する

それでは早速、ログイン画面を実装していきたいと思います。
今回は、ログインボタンを持った画面を作成し、ボタンを押したときに下図のようなログイン画面に遷移するようにします。

それでは早速ソースコードを見てみましょう。

FbSampleActivity.java

public class FbSampleActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        facebook = new Facebook(ApiKey);

        Button login = (Button)findViewById(R.id.login);
        login.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View v) {
				if(!facebook.isSessionValid()){
					facebook.authorize(FbSampleActivity.this, new String[] {"publish_stream"}, new DialogListener(){

						@Override
						public void onComplete(Bundle values) {
							// ログイン完了後の処理
							Toast.makeText(FbSampleActivity.this, "Complete!", Toast.LENGTH_SHORT).show();
						}

						@Override
						public void onFacebookError(FacebookError e) {
							// Facebook側のエラー検知
							Toast.makeText(FbSampleActivity.this, "FacebookError!", Toast.LENGTH_SHORT).show();

						}

						@Override
						public void onError(DialogError e) {
							// 端末側エラー検知
							Toast.makeText(FbSampleActivity.this, "Error!", Toast.LENGTH_SHORT).show();

						}

						@Override
						public void onCancel() {
							// ログインをキャンセルされた際の処理
							Toast.makeText(FbSampleActivity.this, "Cancel!", Toast.LENGTH_SHORT).show();

						}

					});
				}
			}
        });
}

まず7行目にて、Facebookクラスのインスタンスを生成しています。
コンストラクタの引数には、「AndroidでFacebookの認証を行う(準備編)」で取得したAPIキーをセットします。
11行目から、ボタンが押された際の処理です。
14行目で、FacebookクラスのisSessionValid()メソッドを用いてユーザーのログイン状態を判定しています。
既にログイン済の場合は分岐内の処理は無視されます。
15行目でログイン処理を開始します。Facebookクラスのauthorize()メソッドを用いてログイン処理を行います。
authorize()メソッドの引数にはそれぞれ以下を指定しています。

[table “241” not found /]

ここでのポイントは第2引数に指定するString型の配列です。
Facebookのアプリケーションを作成する際には、アプリケーションがユーザーの様々な情報にアクセスする場合があります。
そのためには、ログイン時にユーザーにそれらの情報へのアクセス許可(パーミッション)を得る必要があります。
その際に、どのような許可をユーザーに促すかを、Facebook指定の文字列で定義できるのが第2引数です。
指定できるパーミッションはこちらにある通り、たくさんありますが、例えばサンプルにあるように”publish_stream”パーミッションを指定すれば、アプリケーションがウォールへの書き込みや、友達の書き込みへのコメントを許可するようユーザーに促します(下図参照)。

※ “offline_access”パーミッションは2012年5月に廃止されたようです。
あとは各種コールバックメソッドですが、こちらはソースコード上のコメントを見て頂ければわかるかと思います。

onComplete()メソッドについては次節でもう少し解説します。

Facebook公式アプリケーションのインストール状況による違い

AndroidにはFacebookの公式アプリケーションが用意されており、Google play(旧Google market)からインストールすることができます。
このFacebook for Androidが端末にインストールされている場合とインストールされていない場合では多少ログイン時の動作が異なります。
以下のソースコードを見てください。

FbSampleActivity.java

public class FbSampleActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

(...省略...)
			@Override
			public void onClick(View v) {
				if(!facebook.isSessionValid()){
					facebook.authorize(FbSampleActivity.this, new String[] {}, new DialogListener(){
						@Override
						public void onComplete(Bundle values) {
							// ログイン完了後の処理
							// 公式アプリ非インストール時はログイン後直接処理が走る
							Toast.makeText(FbSampleActivity.this, "Complete!", Toast.LENGTH_SHORT).show();
(..省略...)
				}
			}
        });
}
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // Facebook公式アプリインストール時は、ログイン後こちらを経由してからonCompleteが呼ばれる
        facebook.authorizeCallback(requestCode, resultCode, data);
    }

Facebookのログイン認証画面でアプリケーションの許可を行った際に呼ばれるonComplete()コールバックメソッドですが、
Facebookの公式アプリがインストールされている場合はonComplete()メソッドが呼ばれる前にonActivityResult()メソッドが呼ばれます。
onActivityResult()メソッド内でFacebookクラスのauthorizeCallback()メソッドを呼び出すことで、onComplete()メソッドに処理が移ります。
ログイン画面も以下のように異なります。
  
左図:公式アプリインストール時 右図:公式アプリ非インストール時

以上でFacebookログイン認証完了です!

One Comment