DRY

Web関連の技術の事、食事/お酒の事、旅行の事など

Androidの実機でFacebookSDKの認証をする方法

昨日までは、Eclipse上で開発をしていたのでちょっと実機でFacebookの友達リスト取得するとパフォーマンスどれくらい出るかな〜?と思って、実機上で動かそうと手を付けたのが悲惨の始まりでした。。。

まあ遅かれ早かれいずれやらなきゃいけないのですが。。。


今回はAndroid SDKを用いたFacebook連携で、Eclipse上だと動くのに実機で動かそうとした場合、Facebookからのコールバック


@Override
public void onActivityResult (int requestCode, int resultCode, Intent data)
{
super.onActivityResult (requestCode, resultCode, data);
m_facebook.authorizeCallback (requestCode, resultCode, data);
}
関数で「invalid_key」が戻ってきてしまう場合の対処方法です。


■環境
Windows7 x86_64
Eclipse 3.6 Helios
Cygwin
└OpenSSLは必須です
GalaxyS2


先にお伝えしておくと、Macの環境がある場合はMacで作成した方が多分楽にできると思います。
結果的に手順はそんなに変わらないですが、気持ちの問題が。。。



最後の最後、出来る直前で見つけたコチラのエントリの通り

Windows Vista 64bit環境にOpenSSLをインストールして上記コマンドで生成したキーハッシュだとNG。Mac Book Airで生成したキーハッシュだとOK。
ちゃんと原因を調べていないが、どうもWindows OSの64bit環境だと、同じようにハマった人がいた。Mac Book Airで生成したキーハッシュだとこの先問題なく進めた。32bitなWindowsだとOKかもしれんが未確認。んなアホな、と思うが事実。

と言う事のようですので。



こういうエントリがあったりして
とりあえず(あんまり詳しくないのですが)AndoridのキーとかFacebookのAPP_IDとかの結び付きが何となく違うんだな〜って
事はわかりました。
下記の注意点をちゃんと調べ直す事にしました。

nvalid Key could be for a number of reasons -

Make sure you have Keytool and OpenSSL installed.
Make sure you are giving the correct Keystore file in the command.
Make sure you are giving the correct Alias.
Make sure you copied the generated Hash Key correctly to the Facebook application correctly.


実際のデバイス上でアプリケーションを動かすためには、keytoolでの署名が絶対不可欠なのは、Webとか本とかで何となくわかってはいたのですが、Eclipse上でdebugモードで開発する分にはkeytoolとかは意識しなくて良い(Eclipseが行ってくれていた)ので、知識が不足してました。


このサイトこのサイトを見させて貰ってkeytoolを叩いて試すも、アプリを実機からアンインストールしたり、もう一度鍵を作り直したり、Facebookの開発ページの「HTML5/WEB or NATIVE」をNATIVEにしてみたり(これは違うとわかっていても。。。)何をいくらやっても「invalid_key



いくらか調べて改めてココをみてみると
下のコメント欄で私と近しいエラーでのやり取りの文がありました。

Hi,I created a new key and generated a key hash for same, i submitted that hash to facebook and signed app with that key, but it is not working. Same invalid_key error is coming. On facebook app settings page where we input hash key what should be the value of RADIO button HTML5/WEB or NATIVE? – om252345 Dec 21 '10 at 12:00

                                                        • -

It should be HTML5/Mobile Web. Native app means it came built in with the phone. Can you try out using the Eclipse debug keystore, and see if it works with that ? – Abhinav Dec 21 '10 at 15:11

                                                        • -

Hi abhinav, yes I tried with debug key and generated hash, it also gives facebook error, one strange behaviour is that when I updated facebook app on device the old installed apps are working with sso but new installed different apps with same key sign are giving facebook error..... – om252345 Dec 22 '10 at 5:06

                                                        • -

When I put in the wrong key, Android showed the same behaviour in my case. I still somehow have the feeling that you're putting in the wrong key hash. I hope you're using the following command : keytool -exportcert -alias androiddebugkey -keystore debug.keystore | openssl sha1 -binary | openssl base64 – Abhinav Dec 22 '10 at 6:13

                                                        • -

Moreover, make sure you're in the correct folder, and the password given is "android" – Abhinav Dec 22 '10 at 6:15


まあ要するに

一度鍵を作り直したりしたけど、invalid_keyになっちゃうんだよ。Facebookの開発ページの「HTML5/WEB or NATIVE」はどうあるべきなの?

                                                        • -

HTML5/WEBのはずだよ。Nativeはビルトイン(端末搭載)の時を意味するよ。Eclipseでkeystoreをデバッグしてみて、機能しているかどうかは
確認できますか?

                                                        • -

はい。デバッグキーでハッシュ生成をしてみたよ。ただそれはやっぱりエラー。

デバイス上でFacebookアプリをアップデートするときに、古いインストール済みのアプリケーションで使用しているSSOが、同じキー記号でいろいろなアプリをインストールして与えているからfacebook error

                                                        • -

間違ったキーでやった場合、間違ったなりの挙動をしたよ。あなたが、まだ何か間違ったキーのハッシュを入れている感じがします。
このコマンドを使用してみて下さい

keytool -exportcert -alias androiddebugkey -keystore debug.keystore | openssl sha1 -binary | openssl base64

的な事を言っていると(勝手に)解釈しました(笑)


さらに下を読み進めると

A few things I ran into before I got this working:

1) Generate your hash in linux. Windows (at least for me, 64-bit) didn't generate the correct hash. Download the Cygwin bash shell and do it from there.

2) In the filepath for the keystore, everything should be a forward slash. Even in front of C:. So, for example, C:/Users/YourName/.android/debug.keystore, NOT C:\Users/YourName/.android/debug.keystore.

3) The equals at the end of the hash should be included. Maybe this was obvious to some people, but nevertheless I thought I should mention it.

It SHOULD prompt you for a password. If it doesn't, you've done something incorrectly.


これも要するに

1)少なくとも私にとって64ビットのWindowsは正しいハッシュを生成しませんでした。
Cygwinbashシェルをダウンロードし、行ってください。

2)キーストアのファイルパスは、すべてスラッシュにしなさい。

3)ハッシュの末尾に等号が含まれるべきである。

はしょってますが、こう記載されています。


最初は私もWindowsコマンドプロンプトでやっていたのですが、何となくその辺りっていっつも怪しいので上の3つを守ってコマンドをすべて
スラッシュにし、cygwinでやる事によって無事動きました。


以降が実際のコマンドです。

冒頭記載した通り、cygwinにopensslを入れておいて下さい。


環境変数/配置系は
JAVA_HOME='C:\Program Files\Java\jdk1.6.0_23'

C:\bin\android-sdk-windows\tools


keytool自体のもう少し詳しい解説は、他の方のサイトを見て下さい。


$ cd /cygdrive/c/Users/{USER_NAME}/.android
$ pwd
$ "C:/Program Files/Java/jdk1.6.0_23/bin/keytool.exe" -genkey -keystore k16.keystore -validity 10000 -alias k16

アプリケーションをリリース用の署名モードでコンパイルします。
Eclipseでパッケージ名を右クリックし、[Android ツール]の[Export Unsigned Application Package]を選択します
apkファイルを任意の位置に保存して下さい(後で結局C:/bin/android-sdk-windows/tools/へコピーしますが)
$ "C:/Program Files/Java/jdk1.6.0_23/bin/jarsigner.exe" -keystore k16.keystore -verbose hogehoge.apk k16
最後の「k16」は、キーストアを作成する時に設定した別名(alias)です。

$ "C:/Program Files/Java/jdk1.6.0_23/bin/keytool.exe" -exportcert -keystore k16.keystore -validity 10000 -alias k16 | openssl
sha1 -binary | openssl base64
※ここで標準入出力に表示されたキーをFacebookのデベロッパーサイトの「My Apps」⇒「Mobile and Devices」の「アンドロイド キーハッシュ」のEditに書き込んで下さい。

$ cp hogehoge.apk C:/bin/android-sdk-windows/tools/
$ ls -al C:/bin/android-sdk-windows/tools/hogehoge.apk
$ adb devices
List of devices attached
304D19EAA505746E device
$ cd C:/bin/android-sdk-windows/tools/
$ adb install hogehoge.apk