最近、Androidより娘の相手をしてるほうが楽しいです。@ryosmsです

Android Advent Calendar 2012の裏14日です

ネタがない、と悩んでる時にこんな記事を発見しました
Facebook4JをAndroidアプリ上で動かすサンプルコードを公開しました+α

Facebookのアプリなんかも作ってみたかったので、これ幸いと飛びついてみました

で、このサンプルコード、私の環境では動かすまでにいろいろと修正が必要だったので公開しておきます

環境
  • Mac OS X 10.7.5(Lion)
  • Eclipse Juno 4.2.1
  • Android SDK Tools Rev.21
  • Android SDK Platform-tools Rev.16
  • Android Development Toolkit Ver.21.0.0
  • Maven 3.0.3
  • M2E 1.2.0 


事前準備

  • Facebookに開発者登録する(結構めんどいのでググってがんばれ)
  • Facebookのアプリ登録を行い、App IDとApp Secretを取得する
    GitHubに書いてある通り「Website with Facebook Login」を選択し、Site URLに「http://facebook4j.org」を設定しておく
  • このへんを参考にしてandroid-maven-pluginの環境を構築しておく


動作確認環境

Galaxy Nexus(JCROMなSC-04D)
 Androidバージョン:  4.2.1
 JCROMバージョン: JCROM-0.9.2-20121201

手順

GitHubよりroundrop/facebook4j-android-exampleをclone
Eclipseのワークスペースディレクトリで
$ git clone git://github.com/roundrop/facebook4j-android-example.git F4JSample

上記プロジェクトをEclipseにimport
[New]→[Project...]→[General]→[Project]でProject nameに「F4JSample」を入力してfinish

プロジェクトをMavenプロジェクトに変換
[Configure]→[Convert to Maven Project]

プロジェクトにエラーマーク(赤!)が付いてるので、プロジェクトのBuild Pathを修正
[Build Path]→[Configure Build Path...]→[Java Build Path]→[Source]タブから/src/test/javaを削除 
もしくはsrcディレクトリにtest/javaディレクトリを追加 

App IDとApp Secretをfacebook4j.propertiesにセット
・src/main/resourcesのfacebook4j.properties-templateをfacebook4j.propertiesにリネーム
・取得済みのApp IDとApp Secretをセット

(GitHubのREADMEにはここでRun as Android Applicationしろと書いてあるので)実行
→インストールはできるけど、ActivityManagerがjava.lang.SecurityExceptionを吐いて起動できず
→ドロワーから実行しようとすると「このアプリはインストールされていません。」

AndroidManifest.xmlを修正
6行目:<application>に指定されているpermissionを削除
 android:permission="android.permission.INTERNET"
uses-permissionではないので注意!
Lintの警告がいろいろ出てるので、ここでついでに解消してあげてもおk
  • uses-sdkの指定がないので指定する
  • <application>からandroid:debuggable="true"を削除
  • <application>にandroid:allowBackup="false"を追加(別にtrueでもいいけど)

再度実行
→認証開始前に(ダイアログでOK押したら)クラッシュ
java.lang.IllegalStateException: OAuth app id/secret combination not supplied
(facebook4j.propertiesの設定が読み込まれてない?)

OAuthTask.javaのonProgressUpdateで強制的にfacebook4j.propertiesの内容をセットしてみる

Facebook facebook = mOAuthWebView.getFacebook();

facebook.setOAuthAppId("**********", "********************");

facebook.setOAuthPermissions("email,publish_stream");


再度実行
→Facebookのログインページが表示された!
 →けど「認証しろよボケ」ダイアログと認証用のActivityの無限ループ... orz

例外を確認してみると「read_streamのパーミッションがねーよバーカバーカ」ということだったので、11で追加したsetOAuthPermissionsにread_streamを渡してみる
facebook.setOAuthPermissons("read_stream");

読めた!

facebook4j-android-example

というわけで、オリジナルのリポジトリをforkして、上記の手順で行った修正(の一部)を反映したものをGitHubに公開しました

ryosms/facebook4j-android-example

masterにはOAuthTask.javaへの修正以外を反映しています
(本来ならfacebook4j.propertiesから設定を読み込むはずなので、facebook4j.properties-templateのpermissionsを変更しています)

OAuthTask.javaへ追加した、App ID、App Secret、Permissionsをコードで直接指定する修正はno-propertiesブランチを作成して追加しています

試してみる場合は適当にcheckoutしてみてください

  1. no-propertiesブランチの内容をpull(clone)して
  2. Mavenプロジェクトに変換
  3. OAuthTask.javaの該当箇所を探してApp ID、App Secretをセット

で、動作すると思います

(このサンプルのやり方はいろいろとアレなので、実際にアプリを作成する時にはベストプラクティス的なやり方を探してみて下さい)


※このブログを書いてる時に、Mavenを使わないバージョンを@kimukou2628さんが作ってくれました

kimukou/facebook4j-android-example


まとめ

Facebook4Jを使うことでFacebookアプリ作成の夢が広がりんぐですね

「Facebook4Jよくできてんな」と言えるくらい使ってみたいですね
(facebook4j.propertiesから設定が読めてないところとかはよくわからないので、有識者の方にがんばってもらいましょう←)


ということでAndroid Advent Calendar 14日目担当 @ryosmsでした
そろそろ折り返しが近づいて来ましたね
明日は表が@sys1yagiさん、裏が@kenz_firespeedさんです


br /