2012年2月27日月曜日

AndroidとFacebook連携をやってみて発狂しそうになったから備忘録

タイトルが酷いですが、本当のことなのです。

昨日、現在開発中の要件で「FacebookとTwitter」への投稿をしなくちゃなりません。
最近SNSも流行っているので時代の流れですね!

Twitterとの連携に関しましては、@yusukeyさんが作られたTwitter4Jを使っています。
後でライセンス周りを確認しなくては…。

では、Facebookはどうするのかとなりまして色んなサイトを参考にしてちまちまと環境構築をしていきました。
最初に参考にした記事はこちらの記事です。


1.Git環境構築
ほむほむ、Gitから最新SDKを落としてこないといけないのですね。
はい、最初の関門!
私の会社はSVNでのバージョン管理ですので基本的にGitの環境がありません。
なので、そこから環境構築です。
あ、ちなみにマシンはWindows7使っていますよ!

さらに調べていくとTortisesGitなるもので落とすと便利とありました。
「じゃあ、これを入れるぞ!」となったのですが、TortisesGitを動かすためにはGit Bashなるものが必要とのこと。
で、Git Bashを入れるにはmsysgitを入れないといけないので、インストールします。

これで突貫のGit環境構築が出来上がりました。
てなわけで、こちらからFacebookSDKを落とします。
https://github.com/facebook/facebook-android-sdk/



2.Facebook連携のためにアプリを登録
Facebook連携のために、アプリをこちらに登録します。
https://developers.facebook.com/apps
そうなると細かい設定もできるようになります。
アプリ名等を登録して、いざAndroidとの連携部分に着手します。
…Android Key Hash?
なにこれ???
と思ったのでとりあえず、後回し。
とりあえず、AppIDがゲットできればここはOKです。



3.FacebookSDKのライブラリ作成
githubから落としてきたSDKをソースに入れても動きません。
Androidのライブラリプロジェクトとして動かさないと動かないのです。
面倒やなーと、なりましたがFacebook連携をやるのならこれぐらい簡単でしょ?ということなのでしょうきっと。
というわけで、SDK用のライブラリプロジェクトを作成します。
新規Androidアプリを作成する時に、外部ソースを読み込みを選択します。
ただ、私なんかこれでうまく動かなかったんですよね。
ちなみに外部読み込むをするソースはこちらです。
facebook-android-sdk/facebook
動かない場合はこの中のソースを新規に作ったプロジェクトの中にコピペすれば幸せになれますよ!
とりあえず、これでSDKのライブラリは作成できました。

次に、自分のAppIDga有効かどうかを確認します。
私はsample内のsimpleを使って遊んでみました。
そんでもってデバッグもしてみて、挙動を確認してみました。
public static final String APP_ID = "xxxxxxxx";
この部分に登録したAppIDを記入します。
これでアプリは実行できますが、KeyHashを登録していないためログインに失敗します。


4.Key Hashを作ろう
これに一番はまりました…。
もうね、Windowsの環境構築に苦しむのはいやんなのです。
けど、これしかマシンが無いので半泣き状態でやりましたとも、ええ。

閑話休題。

さて、Key Hashを作成にするには下記のものが必要です。
・JDKのkeytool.exe
・C:\Users\ユーザー名\.android内にあるdebug.keystore
・opensslコマンド
コマンドについてはさっぱりですので、とりあえずcd でkeytoo.exeのところまで行き、下記のようなコマンドを打ちました。

keytool -exportcert -alias simple -keystore "C:\Users\ユーザー名\.android\debug.keystore"
| openssl.exe  sha1 -binary
| openssl.exe base64

ここでopensslコマンドが有効じゃないよと怒られました。
なので、OpenSSLの設定をこちらを参考にしてやっていきました。
http://homepage2.nifty.com/protocol/openssl/
ふむふむOpenSSLをWindowsで動かすにはActive Perlが必要らしい。
それならActive Perlを入れてみます。
それからOpenSSLのインストールを行います。
さあ、どうだ!とコマンドを打ってみる。
…動かない。
何故???

とりあえず、調べまくると環境変数が問題っぽい。
調べまくると、
OPENSSL_CONF C:\OpenSSL-Win64\bin\openssl.cnf
PATH \OpenSSL-Win64\bin
を設定すればいいらしい。

とりあえず、keytool.exeのフォルダに移動してversionコマンドを打つと動いた!
さあ、これでKeyHashが作れる!

keytool -exportcert -alias simple -keystore "C:\Users\ユーザー名\.android\debug.keystore" | openssl.exe  sha1 -binary | openssl.exe base64
もう一度こいつを打ってみた!
…エラー???
「simpleなんかないよー」
というのが出てきた。
最後に最後にこれかよ。
なのでコマンドを探しました。
すると、こちらが参考になりそうです。
http://d.hatena.ne.jp/language_and_engineering/20110830/p1

keytool -exportcert -alias androiddebugkey -keystore C:\Users\ユーザ名\.android\debug.keystore | openssl sha1 -binary | openssl base64

おお、うまくいきそう。
キーストアのパスワードが訊かれますが、debug.keystoreは全て同じパスワードなので「android」と打ちます。
するとずらずらとハッシュが表示されました!


5.アプリと連携させてみる
Facebookのアプリ情報設定画面でこの表示されたKeyHashを登録します。
そして、simpleアプリを起動させるとログインできました!

いやはや良かった良かった。

ここまでの苦労を水の泡にしたくなかったものです。


正直なことを言うと、メッセージのみしか送らない(twitpic投稿等もしなくて、純粋にメッセージのみ)のなら、暗黙的Intentを使ってメッセージを他のアプリに送ることができるのだから、TwitterやFacebook連携にこだわらなくてもいいんじゃないのかなーと思いましたとさ。

2012年2月7日火曜日

ブラウザからアプリを立ち上げてみよう!

こういう要件があって、面倒やなーとなっていましたがあっさりとできたので備忘録。

1.Manifext.xmlでActivityの定義を行う









こんな感じで定義します。
ここでミソなのがintent-filter内の



です。

まず、

はブラウザから参照できますよーという意味だったはずです。
うん、うろ覚えですみません。

そして、

はブラウザというかhtmlに指定するスキーマです。
こちらはアプリで一意になるようにした方が良いです。
他のアプリでもこういうことをしているアプリと競合が起きたら困りますもの。
とりあえず、これで下準備はOK


2.呼び出し元のhtmlの準備
ブラウザから呼び出すためにはhtmlが必要なのねん。
というわけで、どういう風なhtmlを準備すればよいのかを簡単に記載します。

 

アプリ起動テスト
 
アプリ起動
基本的にはこの書き方でOKです。
確か動いたので。

そして、やはりWebとの連携ですからWeb側から適宜DBの値をgetで貰うことも可能です。
その場合はhtmlは
 

アプリ起動テスト
 
アプリ起動
と記載します。

3.Activityの準備
呼び出される側のActivityの準備です。
今回はとりあえず基本的なこととして、onCreateで取得したURLをLogcatに表示させるようにします。

protected void onCreateDetail(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

Intent intent = getIntent();
String action = intent.getAction();

if(Intent.ACTION_VIEW.equals(action)){

Uri uri = intent.getData();
String url = uri.toString();
//とりあえずログに出す
Log.d("Dbg", "uri = [" + url + "]");
}

こんな感じで書けば「startapp://id=123」が文字列として取得できるので、適宜処理をしてあげて素敵にしましょう。

ふう、マジメな記事を書いて疲れました…。