ブログ

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の小林でした。
http://woodsmall.co.jp

スポンサードリンク

  • このエントリーをはてなブックマークに追加

関連記事

スポンサードリンク

 

30代半ばのオッサンが起業した話

プロフィール

kobayashi-profile
代表取締役CEO 小林 高志
1999年からシステムエンジニアとして、クライアントサーバのシステム構築、WEBシステムの開発、Androidアプリの企画・開発、iPhoneアプリの企画・マーケティング等に携わる。
2012年からカメラマンとして都内のスタジオに従事。
2012年、株式会社woodsmall創業。
2013年5月に代表取締役に就任。
自身の半生を綴った書籍を出版するのが、個人的な目標。
趣味は、カメラ・車・バイク・料理。

代表取締役の略歴はこちら

社長のブログについて

検索してもヒットしなかったアプリ開発に関する技術的な記事から、その時に思ったことなどを素直に書き綴っています。

スポンサードリンク

Facebook

twitter

対応エリア

株式会社woodsmallは、千葉県をはじめ関東エリア、関西エリアでのホームページ制作、アプリ開発(Android、iPhone)、システム開発、チラシ制作を承ります。

【千葉県エリア】
船橋市、市川市、習志野市、浦安市、鎌ヶ谷市、松戸市、柏市、成田市、佐倉市、千葉市中央区、千葉市花見川区、千葉市稲毛区、千葉市美浜区、千葉市若葉区、千葉市緑区、白石市などの千葉県エリア

【東京都エリア】
足立区、荒川区、板橋区、江戸川区、大田区、葛飾区、北区、江東区、品川区、渋谷区、新宿区、杉並区、墨田区、世田谷区、台東区、中央区、千代田区、豊島区、中野区、練馬区、文京区、港区、目黒区などの東京都エリア

【神奈川県エリア】
横浜市、川崎市、藤沢市、茅ヶ崎市、大和市、海老名市、座間市、綾瀬市、平塚市、寒川町、大磯町、二宮町などの神奈川県エリア

【埼玉県エリア】
さいたま市、川口市、蕨市、戸田市などの埼玉県エリア

【関東・関西エリア】
その他、茨城県、栃木県、群馬県の関東エリア、長野県、新潟県の甲信越エリア、大阪府の関西エリア、全国からのご依頼に対応させて頂きます。
(遠方の場合は電話やメール、LINE、Skypeでの打合せとなります。)

ページ上部へ戻る