Facebook対応してみました

SmartTraining 5.4.0で真面目にFacebook対応してみたのでメモメモ。

◆動機
ここのところ、「あれ、こんな人(いかにもFacebook使わなそうな人という意味で)からFacebookの友達登録キタ」。だんだん広がってるんだねぇ。と実感。じゃぁ、SmartTrainingもTwitterと同じレベルでFacebook連携したいよね。

◆これまで
これまでのバージョンでも「Facebookにリンクをシェアする」という形でなんちゃってFacebook対応はしていました。
この仕組は、URL(テキストではなく、わざわざ表示対象となるデータをGoogle MapsにアップしてMapのURLを取得していた)を含んだIntentをFacebook本家のアプリに投げるというものでした。
どういうわけか、Facebook本家のアプリは、plain/textなIntentのデータを無条件でURLとして扱ってくれます。これはただのテキストを送ってもそれを取り扱えず、テキストのみをFacebookのウォールに投稿することができないという意味になります。個人的には爆発してほしい仕様です。

◆逃げ道は?
まずは、手っ取り早い逃げ道。
plain/textなIntentからStringを取り出してFacebookに投稿してくれるFacebook本家以外のクライアントを経由すればいいわけです。
例えば、TweetDeckがその機能を持っています。が、このクライアントの使用をユーザに強要するわけにもいきませんので、残念ながら真面目にFacebook対応をしなくてはいけなくなります。

◆(渋々)真面目にFacebook対応してみる
まずは、Facebook Android SDKについて理解します。
、以上!


で終わらせるのはさすがにアレなので、もう少し詳しく。

・普通にAndroidアプリが開発出来る環境を準備。
・Git使えるようにする。
・GitHubリポジトリからFacebook android SDKをダウンロードする。
> git clone git://github.com/facebook/facebook-android-sdk.git
で、取ってこれる。
・SDKに含まれるFacebookディレクトリ内のソースをAndroidプロジェクト(Facebookライブラリ)として作成する。

・Facebook側にアプリを登録する。
アプリ登録
の画面右上の「+Set Up New App」を押して適当に登録する。
重要なのは、「設定を編集」>「Mobile and Devices」の「アプリケーションID」と「アンドロイド」>「キーハッシュ」の2つ。
・Facebook SDKを利用するアプリ(Facebookクライアント)を作る。上記、Facebookライブラリプロジェクトに対して参照設定をする。プロジェクト>プロパティ>Android>Use Library。
とりあえず、感触だけつかみたければ、Facebook SDK内のexamples/simpleをインポートしてみればいい。
・Facebookクライアントにandroid.permission.INTERNETのパーミッションを追加する。
・Facebookクライアントに認証機能と、ウォールへの投稿機能を実装する。
Facebookクラスのインスタンス生成に上記「アプリケーションID」を与える必要がある。
Facebook mFacebook = new Facebook("xxxxxxxxxxxxxxx"); // アプリケーションIDは15桁の数字
・Facebookクライアントをビルドする。ビルド時に指定した署名に使うkeystoreを使って、キーハッシュを生成してFacebook側に登録する必要があるので、デバッグ用Keystoreを使ったのか、自前の正式なKeystoreを使ったのかを把握しておく。
・キーハッシュを生成する。

> keytool -exportcert -alias [エイリアス] -keystore [keystoreファイル] | openssl sha1 -binary | openssl base64

ここでハマりポイント。
Windows Vista 64bit環境にOpenSSLをインストールして上記コマンドで生成したキーハッシュだとNG。Mac Book Airで生成したキーハッシュだとOK。
ちゃんと原因を調べていないが、どうもWindows OSの64bit環境だと、同じようにハマった人がいた。Mac Book Airで生成したキーハッシュだとこの先問題なく進めた。32bitなWindowsだとOKかもしれんが未確認。んなアホな、と思うが事実。
・生成したキーハッシュを、先ほどFacebookに登録したアプリの情報に登録する。
http://www.facebook.com/developers/
「設定を編集」>「Mobile and Devices」の「アンドロイド」>「キーハッシュ」。
・あとはアプリを実行して試す。invalid_keyとかが返ってきたら、ハッシュキーが怪しい。
・以下うまく行けば、認証が成功して、ウォールへの投稿ができる。投稿までの適当な処理。こんなコードよりExampleを見るのが一番。
----


facebook = new Facebook("xxxxxxxxxxxxxxx");
SessionStore.restore(facebook, this); // SesstionStore.save()しといたセッションをrestoreすると毎回ログインしなくても良くなる。

if ( !facebook.isSessionValid() )
{
facebook.authorize(this, new DialogListener() {
@Overrid
public void onComplete(Bundle values) {
SessionStore.save(facebook, FbPostSampleActivity.this); // ログイン成功したらセッションを保存しとく。

Bundle b = new Bundle();
b.putString("message", "MOMOMO"); // ウォールにMOMOMOと投稿する。
facebook.dialog(FbPostSampleActivity.this, "feed", b, new PostDialogListener());
}
}
else
{
Bundle b = new Bundle();
b.putString("message", "MOMOMO");
facebook.dialog(FbPostSampleActivity.this, "feed", b, new PostDialogListener());
}

public class PostDialogListener extends BaseDialogListener {

public void onComplete(Bundle values) {
final String postId = values.getString("post_id");
if (postId != null) {
Log.d("Facebook-Example", "Dialog Success! post_id=" + postId);
mAsyncRunner.request(postId, new WallPostRequestListener());
} else {
Log.d("Facebook-Example", "No wall post made");
}
}

}

public class WallPostRequestListener extends BaseRequestListener {

public void onComplete(final String response, final Object state) {
// 適当に処理
}

@Override
public void onFacebookError(FacebookError e, Object state) {
}
}


雑ですが、いじょ。

めんどくさっ!!!!!!
text/plainなIntent投げさせて欲しいなぁ。3行で済みそうな処理だ。

コメント

このブログの人気の投稿

Joinノードを使う(その1)

Execノードを使う

Joinノードを使う(その4)