ブログランキング・にほんブログ村へ


iPhone/iPad用潜水艦ゲームアプリ ソナーエコー iTunesにて公開中

2012年09月29日

Eclipse プロジェクトのバリエーションを作る

Andoridに限らないがEclipseでJavaの開発をやっていて、アプリのバリエーションを作りたいことが出た場合。無料版と有料版とか。
Cだったら#ifで分けるような方法が採れるのだが、Javaにはプリプロセッサがなくそういう方法が使えない。

擬似的な方法として、プロジェクトをもう1つ作ってファイルやフォルダをリンクさせるという方法が割と使えるようだ。

具体的には、もう1つプロジェクトを作る。そして必要なsrc,assets,resなどのフォルダをリンクさせる。
リンクは普通に新規フォルダを作る手順でダイアログを出すと、下の方に「拡張>>」というボタンがあるのでこれを押す。
link to alternate locationのラジオボタンを選び、参照ボタンでリンク先のフォルダを選ぶ。これで実体のないリンクだけのフォルダを作れる。
assets,resはプロジェクトを作ると勝手に出来てるので、実体フォルダをまず削除してからリンクフォルダを作る。
gen,binはそのまま実体でよい。
AndroidManifest.xmlなどフォルダ単位でリンクできないものは、新規でファイルを作る手順をとるとフォルダのときと同じように「拡張>>」ボタンがあるので「ファイルシステム内のファイルにリンク」をチェックして、フォルダのときと同様に参照でリンク先ファイルを選ぶ。
これも実体としてのAndroidManifest.xmlがあると出来ないのであらかじめ削除しておく。

こうやってあらかたファイルをリンクして、実体として置いたファイル(.java)などで違いを出すように設計する。

ただしこのEclipse内の方法ではリンクできないファイルがある。
それは *.soファイル、jniで作られたライブラリだ。
これだけはEclipse内のリンクでは認識しないようなので、自分はunixのシンボリックリンクで対応した。windowsでは知らん。
posted by みこあいさ at 10:16| Android開発

2012年09月24日

ubuntuにandorid開発環境を入れた

Andoridの開発環境。Macの方は割と快適なんでまぁいいとして、Windowsでやってた方が問題。
とにかく遅いし、オープンソース系で支えられてるAndroidとwindowsとの相性が最悪。jni開発でcygwinひっぱり出してきたりもうわけわからん世界。

そんなこんなで苦しんでいたら、開発環境をクリーンインストールする機会に恵まれた。
滅多にないチャンスなので、VMWareでlinux入れてそこにeclipse + ADTの開発環境を構築してみることにした。実用前提で。無謀か。

選んだlinuxはubuntu。よく知らないけど最近よく聞くから。という程度なんだけど。バージョンは12.0.4、日本語版。
構築のとき色々のたうち回ったときに収集した情報を備忘録的に残しておく。またやるかもしれないし。
いつも通り手取り足取り的丁寧さはなし。


まずは
Ubuntuの入手
ネット上の資料にはVMWareのイメージを配布してるって記述もあるけど、今はもうないみたい。VirtualPCの人はまだある。
ここからisoを落とす。LTSってのが長期サポート版とかでそこそこ長く使えることを保証してくれてるバージョンらしい。
日本語版を落とした。これのほうが楽ちんかもしれないけど、日本語版には64ビット版はないらしい。VMWareに入れる程度なら32bitsで充分って気もするが。でも日本語版だとユーザーのホームディレクトリが日本語化されて ~デスクトップ とかになる。気持ち悪い。

VMWare toolsのインストール。winだとマウスだけでできるけど、linuxだと一手間かかる。
VMware Toolsのインストール
このサイトではVMWare Fusionで解説してるけどFusionじゃなくても同じ。

Eclipseの導入
ubuntuにeclipse+ADTいれるっていうことでぐぐるといっぱいひっかかるんだけど、何故かほとんどがコマンドラインせかせか打ち込んで自前でjdkレポジトリ追加して…ってのばかり。
だけどやってみたらこのサイトで紹介しているように Ubuntuソフトウェアセンター → eclipseで検索 →インストール
ですっぱり入っちゃった。Ubuntuソフトウェアセンターってやつの使い勝手はGoogle playよりapp storeに近い感じ。
このサイトにあるように
Extensible Tool Platform and Java IDE

Japanese Language package for Eclipse using Dynamic AOP,Pleiades
も同じようにUbuntuソフトウェアセンターでインストール。いやー便利。
でもプレアデスの日本語化は自分でやらないとダメなんでそれはちょっとだけ頑張る。

次にAndroid SDKのインストール。
Ubuntu で Android SDK と Eclipse ADT プラグインのダウンロードとインストールとテスト実行
このページの Android SDK のダウンロードとインストール ってとこだけやる。
コマンドラインからddms動かしたりとかはやんなくてOK。

それからダダーっと飛ばして
 Eclipse ADT (Eclipse のプラグイン Android Development Tools) のダウンロードとインストール
ってことをやる。JDKのあたりはよくわかんないけどやんなくてOKだった。open-jdkとかいうのが入ってるからそれでOKってことなんだろうか?
 Eclipse の Android SDK マネージャを起動し,Android SDK がインストール済みであることを確認
ってことまでやったら、おしまい。AVDとか糞遅くて使いもんにならないんで要らない。

ちなみにAndroid SDKインストールしてるときに
MOTODEV がどーしたとかいってログインダイアログが出てぎょっとすることがある。
これって、モトローラのAndroidのなんかソフト入れるのにMOTODEVってとこのアカウントがいるってことらしい。
そもそもそんなもの選択する必要ないんだけど、なんかの間違いでチェックしちゃったのだろう。キャンセルでOK。
モトローラの携帯なんて日本で使ってるやついるんかいな。

過去のプロジェクトをインポートし、さぁーじゃぁビルドは通ったかなーとドキドキしてみてると
Unable to resolve target 'android-8'
みたいなエラーが出ることが。
これはSDKインストールのとき、プロジェクトで指定したバージョンのSDKが入ってないことに起因する。
この例の場合 APILevel-8 = 2.2 が入ってない。自分としては2.2チェックしたつもりだったのに何故か入ってなかった。
ひょっとして上記のMOTODEVとやらをキャンセルしたからかもしれない。
当然、後からAndroid SDK Managaerで入れ直せばOK。

当然といえば当然だが、そのままではubuntuはAndroid実機を認識しない。ここでも一手間。
UbuntuでAndroid端末を認識させる
面倒といえば面倒だけど、Galaxyとかwindowsでも得たいの知れないドライバ入れないと認識しなかったりするんで、それからみれば何を入れたのかはっきりしてる分見通しがいい。


最後に。
windowsでやるよりはマシだけど、思ったほどは速くない。ubuntu。
posted by みこあいさ at 23:55| Android開発

2012年08月22日

Android Facebookのハッシュがどうしても合わないとき

Facebookのアプリ登録には例のめんどうなハッシュキー登録が必要なわけだが、これがなぜだか合わない。

調べてみると、ハッシュを作るときのコマンドラインが問題ってのが多かった。

keytool -exportcert -alias [なんちゃら] -keystore [キーストアのパス] | openssl.exe sha1 -binary | openssl.exe base64

例のこのコマンドラインなんだけど。

Windowsでやってると、ファイルを指定するのに \ を使ってるとやばいんで / に変えるように、ってのがあるように、些細なことで値が変わる。
使うJDKのバージョンによっても変わるし、keystoreをパス指定したときと、カレントにcdで移動して処理したときも違う値になる。

一体どれが正しいの?
macとかのunix系でやると平和という情報もあった。

散々悩んでついに正しいハッシュキーを知る方法を見つけた。opensslとかjdkのkeytoolとかなしで。

FacebookのSDKのサンプルソースが元になってるという前提だと、
API_KEYを指定して、まずは強引にログインする。ハッシュキーはおかしいはずなんだが、なんか通る。
(多分エラーになってるけどそのまま放置してるだけだと思う)

それでそのままこんな感じのプログラム(前の記事と同じ)で

String response = mFacebook.request("me");
Bundle parameters = new Bundle();
parameters.putString("message", msg);
parameters.putString("description", "post by test program");
response = mFacebook.request("me/feed", parameters,"POST");

強引にpostすると

responseにエラーが返される。
このresponseはJSONになってるのでエラー内容を読んでみると、

invalid_key:Android key mismatch. Your key "XXXXXXXXXXXXXXXXXXXXXXXXXXXX" does not match the allowed keys specified in your application settings. Check your application settings at http://www.facebook.com/developers

こんな感じのエラーメッセージがある。この "XXXXXXXXXXXXXXXXXXXXXXXXXXX"ってのがアプリのキーストアから導き出されるハッシュキーらしい。

この"XXXXXXXXXXXXXXXXXXXXXXXX"をFacebookアプリのハッシュキーに登録したら、通るようになった。

注意点として、"XXXXXXXXXXXXXXXXXXXXXXXX"は最後に "="が抜けてる。

"XXXXXXXXXXXXXXXXXXXXXXXX="
にして登録しよう。


多分この記事をぐぐってみつけてきた人は既に動きかけのソースがあると思うんで、該当箇所にbreakpointをしかけるだけでこのresponseが読めると思う。


しかしFacebook、品質とは無関係にアプリを作るのを複雑にして入ってくるなといわんばかりだが。
スパムとか防御したい運営側の気持ちはわかる。
だがしかし人が集まってるところで技術で自動的にクオリティを上げるってのはやたら技術が複雑になるだけで無益だと思う。

枯れ木も山のにぎわい。

品質は人力によってのみ保たれる。なぜなら品質が主観であり、人間の感じ方だから。

App storeとGoogle playの違いそのままかと。App storeが凄くいいとまでは言わないけれど。


昨今株価低迷が言われるFacebookだけど、懐が狭いSNSに先はない、と思った。

2012.8.24 追記
loginのエラーでも
invalid_key:Android key mismatch. Your key "XXXXXXXXXXXXXXXXXXXXXXXXXXXX" does not match the allowed keys specified in your application settings. Check your application settings at http://www.facebook.com/developers
こういうのが返ってきてることが判明。
具体的にはSDKのサンプルコードLoginButton.javaのLoginDialogListenerのonFacebookErrorにわたってくる引数FacebookErrorからgetMessage()で取れる文字列。
これが一番てっとり早そう。
posted by みこあいさ at 20:20| Android開発