2012年9月2日日曜日

AndroidでGPSとGoogle Map

AndroidでGPSとGoogle Maps Android APIを使ってみてます。
気になったところだけメモ。

・位置情報を一定時間ごとに計測する方法を悩み中

GPS…というか位置計測のやり方は、たくさん資料がありましたが
例えば1分に1回計測する、といった方法は、いまいち見つけられず。

requestLocationUpdates()の第二引数にmsecで秒数を指定すると
それ毎に送られてくるよ、という記事も見かけましたが

私が試した限りでは、第二引数の値にかかわらず
いつでも約1秒 に1回
LocationListenerのonLocationChanged()でlocationが取れました。
むむー

ひとまず、onLocationChangedで取れたものを溜め込んでおいて、
それをいかに使うか、という設計・・?

あるいは、必要なタイミングでrequestLocationUpdatesして、
locationが取れたらすぐremoveUpdateするような方がよいのか・・??

1分に一度とか、10分に一度のような
あまり頻繁に必要としない場合は、後者の方がよさそうな気がしています・・

まだまだ謎であります。


・getBestProvider()

GPSを優先的に使いたかったのですが、
getBestProviderしたら、NETWORK_PROVIDERをオススメされました。
まじめにCriteriaを指定(速度いらない、方位いらない、高度いらない…など)
してみても、しなくても、
いつも NETWORKの方をオススメされます。
結局、isProviderEnabledでGPSが使えるなら使うように、
自前でチェックすることにしました。


・GalaxyS2でonLocationChangedが呼ばれなくて涙目

別のGPSアプリを動かしたら、
自分のアプリの方にも反応が返ってくるようになったのですが。。

当初、位置情報設定でGPSもONにしてるし、ネットワークの方もONにしているのに
なぜかonLocationChangedに入ってこなくて
ずっともやもやしていました

まったく同じソースコードで、同じ設定で
別の端末(4.0のPROGRESSO)で試したら
ちゃんとonLocationChangedに入ってくる・・!

そこで、GPS Testというアプリを動かしてみた後に
自分のを実行してみたら、なんだか動いてる・・という流れでした。

とても謎でした。。

このGPS Testで行っていることを知りたい!
私に足りないヒントがありそうです


・ActivityとServiceの連携・・AIDL
「ActivityにGoogleMapのMapViewを表示し、そこに位置情報を反映させる」
というものを作ってみておりまして
位置情報の取得には、Serviceを使ってみました。

Activityは、MapActivityを継承
Serviceには、LocationListenerを実装

さらに、AIDLを2つ用意しました
ServiceからActivityに位置情報を通知するためのinterface
通知先をServiceに登録するためのinterface

・・初めてのAIDLで頭こんがらがりました。


・Google Maps Android APIを使う
もしかしたら、ものすごく、簡単なことだったかもしれないのですけど
自分はえらくはまったのでメモしておきます。。

私の環境は、EclipseのIndigo、MacでMountain Lionです。

Preference - Android - Build - Default debug keystore
ターミナルでコマンド打って、MD5の値を取得する
keytool -list -keystore (上記のディレクトリ)

・・文字化けがものすごいことになってたのですが、
ターミナルのエンコードの設定ですかね・・。
大事なところ (MD5) は化けてないので、ひとまず良しとします

https://developers.google.com/android/maps-api-signup?hl=ja
My certificate's MD5 fingerprint:
のところに、 大事な (MD5) の値をコピペして、Generate API Keyします

・・遷移したページでも、文字化けてたので、うひーという感じですが
大事なところは化けてないので以下略。
私の場合はレイアウトをxmlで用意したので
com.google.android.maps.mapview・・・をレイアウトのxmlに貼りました。

プロジェクトのProperties - Android - Google APIsの適切なものを選択。

Manifestファイルに、
uses-permissionに、permission.INTERNET
uses-libraryに、com.google.android.maps
を追加

これで動いたはず・・!

2012年6月30日土曜日

XCode4でUnitTest

導入の方法については、図解詳細付きで説明していらっしゃる方のページを参考にしました。

さてテストを書こう!という段階で詰まった時のメモを残します。


○テストケースを実行するメソッド名は「test~」
冷静に考えれば当たり前かもですが。。
最初、testで始まらない名前のメソッド名で、テストケース書いて実行していて
「何で実行されない??」
しばらく悩みました。。
名前がtest~で始まらない、tearDownとかでもないメソッドは、テスト対象にならないのですね。


○NSLogはちょっと隠されたところに出ている
実行されてるはずなのに、いつものウィンドウにログが出てこない…!!
と思っていたら、出てました。いつもとは違う場所に。
海外サイトですが、図解付きで大変助かりました。
http://agilewarrior.wordpress.com/2012/02/28/where-is-nslog-output-for-ocunit-tests/
吹き出しのアイコン、初めて押しました…!
ログを見たくて毎回辿るのですが、ちょっと面倒です。。



(つぶやき)
テスト実行したくないメソッドは、どうすればよいのでしょう。
メソッド名変えればよいんですかね…

2012年3月2日金曜日

DirectX GetBackBuffer

DirectX9です

バックバッファの絵をテクスチャに貼ろうとしています。
フルスクリーン化した時のみ、
GetBackBuffer()でバックバッファを取ると
Pitchがなぜか少しだけ多くなります。
(フルスクリーンではない時は、問題ありません)

device->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &src);
src->GetDesc(&desc);
src->LockRect( &rSrc, &srcRect, 0);

rSrc.Pitchは、desc.Width*4バイトになってくれるはず・・なのですが
自分の場合は、フルスクリーン時のみ、
desc.Width*4 + 96バイトになっています。


うーん・・なぜでしょう
256で割り切れる数に合わせたいとか、何かあるんでしょうか。。

調べてみないとなぁ・・