読者です 読者をやめる 読者になる 読者になる

うさがにっき

読書感想文とプログラムのこと書いてきます

Facebook SDKを使ってシェアする

概要

共有intentをfacebookアプリは受け取るけど処理してくれない…
なのでFacebook SDKを使ってshareできるようにするまで

いろいろ手順があるサイトはあるもののfacebook側の設定画面がかなりの頻度でアップデートされていて、情報がすぐ古くなる
なので、現時点での手順メモ

手順

facebook sdkのインストール

facebook sdk(Android用Facebook SDK)をダウンロード

ダウンロードしたプロジェクトをeclipseにimportする
New>Other>Android Project from Existing Code
RootDirectoryにダウンロードしてきたfacebook sdkを指定
いろいろプロジェクトが表示されるが、ほとんどはsampleなのでfacebookだけをチェック(copy projects into workspaceにチェックを入れると吉)

finishして自分のプロジェクトのライブラリにfacebook追加
project右クリック>properties>Android>Addでfacebook追加

support v4を使っている場合、エラーとなる現象がある
facebook側のsupport v4が古いので、自分のプロジェクトのsupport v4ライブラリで上書きしてやると吉

facebook側の設定

facebookのアカウントを取得して、アプリをfacebookに登録する必要がある
facebookのアカウントがない場合は作成する

facebookの開発者ページ(Android用Facebook SDK)からアプリを作成
f:id:tiro105:20140509110624p:plain


必要な情報(この画面ではパッケージ名とか気にしなくてOK、適当な前を入れる)を入力
f:id:tiro105:20140509110657p:plain


Add platformからAndroidを選択
f:id:tiro105:20140509110717p:plain


パッケージ名、facebook shareを行うアプリのパッケージ名、Activity名をフルパッケージ名で入力
Key HashsはAndroidの著名鍵、そのため普通は開発者用のkeystoreとリリース用の本番keystoreの二つの登録が必要になる
keystoreの位置はeclipseから確認できる
Preference>Android>BuildのDefalt debug keystoreに配置してあるので以下のコマンドをターミナルから入力し、ハッシュキーを取得する

keytool -exportcert -alias androiddebugkey -keystore "{keystoreパス}" | openssl sha1 -binary | openssl base64
f:id:tiro105:20140509110754p:plain


後に必要になるので連絡先メールアドレスを入力
f:id:tiro105:20140509110938p:plain


Status&Previewでサンドボックスモードを解除する
一番上のトグルがいいえになってたらはいにする
はいにできない場合は連絡先メールアドレスが入力されていないからのことが多い
f:id:tiro105:20140509110956p:plain


とりあえずfacebook側の設定はこれでok
アプリIDを後ほど使うのでメモっておく


アプリ側の設定

app idをAndroidManifestに登録
string.xml

<resources>  
    <string name="app_id">0000000000</string>  
</resources> 

AndroidManifest

<meta-data   
    android:value="@string/app_id"   
    android:name="com.facebook.sdk.ApplicationId"/> 

残りは登録したActivityを作成し、コードを書く

Activity

public class FacebookShareActivity extends Activity {
	private UiLifecycleHelper uiHelper;
	private String mShareUrl;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		uiHelper = new UiLifecycleHelper(this, new Session.StatusCallback() {

			@Override
			public void call(Session session, SessionState state,
					Exception exception) {
				Log.i("Activity", "SessionState : " + state);
			}
		});
		uiHelper.onCreate(savedInstanceState);

		share();
		
	}

	private void share() {
		if (FacebookDialog.canPresentShareDialog(getApplicationContext(),
				FacebookDialog.ShareDialogFeature.SHARE_DIALOG)) {
			// facebook appが存在しないときにはwebviewから投稿
			try {
				mShareUrl = getIntent().getStringExtra("shareUrl");

				// Fragment で発行するときは setFragment() を呼ぶ
				FacebookDialog shareDialog = new FacebookDialog.ShareDialogBuilder(
						this).setLink(mShareUrl).build();
				uiHelper.trackPendingDialogCall(shareDialog.present());
			} catch (FacebookException e) {
				Toast.makeText(this, "Facebook でエラーが発生しました。",
						Toast.LENGTH_SHORT).show();
			}
		}
	}

	@Override
	protected void onResume() {
		super.onResume();
		uiHelper.onResume();
	}

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

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

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

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

		uiHelper.onActivityResult(requestCode, resultCode, data,
				new FacebookDialog.Callback() {
					@Override
					public void onError(FacebookDialog.PendingCall pendingCall,
							Exception error, Bundle data) {
						// 何らかの問題でfacebookアプリがインストールされているにも関わらず起動できなかった際にはアプリ内起動とする
						finish();
						Util.makeFacebookLocalIntent(getApplicationContext(),
								mShareUrl);
					}

					@Override
					public void onComplete(
							FacebookDialog.PendingCall pendingCall, Bundle data) {
						Log.i("Activity", "Success!");
						finish();
					}
				});
	}
}

気にした点
facebook appがインストールされていないときはwebviewを使ってエラーにならないようにしている
UiLifecycleHelperはfacebook SDKAndroidのライフサイクルにあわせるために各ライフサイクルの時にcallする必要がある様子、詳しくはUiLifecycleHelper


感想
shareするだけならintent受け取ってくれるだけでいいんだけどな…

参考
Y.A.M の 雑記帳: Android Facebook SDK で share する
AndroidでFacebookの認証を行う方法(準備編) | Tech Booster