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
を追加

これで動いたはず・・!