Androidアプリにfacebook SDKを導入

  •  

 

現在開発中のアプリにfacebook SDKを入れてみました。
このSDK頻繁にアップデートが行われているようで、ちょっと前の記事を参考にすると、コンパイルすら通らない状況です。

facebook SDKの導入については、こちらを参考にしました。
ただ、この通りに書いてもコンパイルが通らないので、こんな感じで書きました。

	// ログインボタン
	private Button mFbloginBtn;
	// ライフサイクルヘルパー
	private UiLifecycleHelper mUiHelper;
	// セッションステートコールバックメソッド
	private Session.StatusCallback mFacebookCallback = new Session.StatusCallback() {
		@Override
		public void call(Session session, SessionState state,
				Exception exception) {
			onSessionStateChange(session, state, exception);
		}
	};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_facebook_login);

		// Set up the action bar to show a dropdown list.
		final ActionBar actionBar = getActionBar();
		actionBar.setDisplayShowTitleEnabled(false);
		// actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
		// UPアイコンを表示
		getActionBar().setDisplayHomeAsUpEnabled(true);

		mLoginFormView = findViewById(R.id.login_form);
		mLoginStatusView = findViewById(R.id.login_status);

		sign_in_button = (TextView) findViewById(R.id.sign_in_button);

		// ライフサイクルヘルパーの初期化
		mUiHelper = new UiLifecycleHelper(this, mFacebookCallback);
		mUiHelper.onCreate(savedInstanceState);
		// ログインボタンの初期化
		mFbloginBtn = (Button) findViewById(R.id.sign_in_button);
		mFbloginBtn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View view) {
				if (bLogin) {
					// ログアウト
					logoutFacebook();
				} else {
					// ログイン
					loginFacebook();
				}
			}
		});
	}

	private void loginFacebook() {
		// リクエストの生成
		OpenRequest openRequest = new OpenRequest(this)
				.setCallback(mFacebookCallback);
		// emailを要求するパーミッションを設定
		openRequest.setPermissions(Arrays.asList("email"));
		// セッションを生成
		// Session session = new Builder(this).build();
		Session session = Session.getActiveSession();

		// アクティブセッションとする。
		Session.setActiveSession(session);
		// 認証を要求する。
		session.openForRead(openRequest);

		return;
	}

	private void logoutFacebook() {
		Session session = Session.getActiveSession();
		if (!session.isClosed()) {
			// セッションとトークン情報を廃棄する。
			session.closeAndClearTokenInformation();

			bLogin = false;
			sign_in_button.setText(R.string.label_facebook_login);
		}
	}

	private void onSessionStateChange(Session session, SessionState state,
			Exception exception) {
		if (session.isOpened()) {
			// GraphAPIのmeリクエストを呼び出す。
			Request.executeMeRequestAsync(session,
					new FacebookGraphUserCallback("wait...") {
						@Override
						public void onCompleted(GraphUser user,
								Response response) {
							super.onCompleted(user, response);

							// Log.d(TAG, "user = " +
							// user.getInnerJSONObject());
							Toast.makeText(cMe,
									String.valueOf(user.getInnerJSONObject()),
									Toast.LENGTH_LONG).show();
							bLogin = true;
							sign_in_button.setText(R.string.pref_logoff);

							String userName = user.getUsername();
							String userId = user.getId();
							String userBirth = user.getBirthday();

//							TextView txtUser = (TextView) findViewById(R.id.txtUser);
//							txtUser.setText(userId + " " + userName + " " + userBirth);

						}
					});
		}
	}

	@Override
	public void onPause() {
		super.onPause();
		mUiHelper.onPause();
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
		mUiHelper.onDestroy();
	}

	@Override
	public void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		mUiHelper.onActivityResult(requestCode, resultCode, data);
	}

	@Override
	protected void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);
		mUiHelper.onSaveInstanceState(outState);
	}

	/**
	 * Shows the progress UI and hides the login form.
	 */
	@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
	private void showProgress(final boolean show) {
		// On Honeycomb MR2 we have the ViewPropertyAnimator APIs, which allow
		// for very easy animations. If available, use these APIs to fade-in
		// the progress spinner.
		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
			int shortAnimTime = getResources().getInteger(
					android.R.integer.config_shortAnimTime);

			mLoginStatusView.setVisibility(View.VISIBLE);
			mLoginStatusView.animate().setDuration(shortAnimTime)
					.alpha(show ? 1 : 0)
					.setListener(new AnimatorListenerAdapter() {
						@Override
						public void onAnimationEnd(Animator animation) {
							mLoginStatusView.setVisibility(show ? View.VISIBLE
									: View.GONE);
						}
					});

			mLoginFormView.setVisibility(View.VISIBLE);
			mLoginFormView.animate().setDuration(shortAnimTime)
					.alpha(show ? 0 : 1)
					.setListener(new AnimatorListenerAdapter() {
						@Override
						public void onAnimationEnd(Animator animation) {
							mLoginFormView.setVisibility(show ? View.GONE
									: View.VISIBLE);
						}
					});
		} else {
			// The ViewPropertyAnimator APIs are not available, so simply show
			// and hide the relevant UI components.
			mLoginStatusView.setVisibility(show ? View.VISIBLE : View.GONE);
			mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE);
		}
	}

	class FacebookGraphUserCallback implements Request.GraphUserCallback {

		private ProgressDialog mProgress = null;

		public FacebookGraphUserCallback(String message) {
			mProgress = new ProgressDialog(FacebookLoginActivity.this);
			mProgress.setMessage(message);
			mProgress.setProgressStyle(ProgressDialog.STYLE_SPINNER);
			mProgress.show();

		}

		@Override
		public void onCompleted(GraphUser user, Response response) {
			mProgress.dismiss();
		}
	}

認証が完了すると、facebook上の一通りの情報が取得できます。
ユーザ名・ID・誕生日を取得しています。
ただ、誕生日はnullでした。

20130726_2

アプリの挙動として、入力したデータを保存するタイミングでfaccebookのタイムラインにも投稿したい。
で、投稿するソースがこちらを参考にしました。

20130726_3

タイムラインにもアプリから投稿した内容が表示されています。

twitterに投稿するという選択肢もありますが、アプリの内容からしても、faccebookの方が合っていると思い、今回はfacebook SDKを導入しました。

株式会社woodsmallの小林でした。
https://woodsmall.co.jp

関連記事

コメント

この記事へのコメントはありません。

TOP