GPSで位置情報を取得する
最近ずっと忙しくて更新できずでした。
TAやら成果発表を聴きに行ったり, 自分の研究をしたりで;
あと今回紹介するGPS取得が非常にてこずってました(三日間くらい調べてました)
今できたので書いていこうかと思います。
目的:GPSをつかって位置情報を取得する
ということでGPSを使って位置情報(経度、緯度)を取得していきます。
リファレンスは
これをみても随分手こずったので本当にややこしいかと;
まず、必ずandroid manifestで打たなければならない許可文を紹介します
GPSで位置情報を取得する場合
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.MOCK_ACCESS_LOCATION"/>
このMOCK_ACCESS_LOCATIONはエミュレータで疑似の位置情報を送るためのもので、これが無いとエミュレータで位置情報を取得できない.COARSE_LOCATIONは低精度の位置情報, FINE_LOCATIONは高精度の位置情報を取得しますという許可文です。これがないとSecurity Exceptionエラーを吐きだしアプリケーションが停止します。
上の二つの文に関しては恐らくFINE_LOCATIONだけでも動くと思います。ネットワークとかから位置情報を取得したいときはCOARSE_LOCATIONを使うんだということ。
※ネットワークを使うときは↓の文も追加
<uses-permission android:name="android.permission.INTERNET"/>
処理の流れ
処理の流れは以下のようになっています
まず初めに
LocationListenerをimplementします。
implementsするとLocationListenerは四つのメソッドを持っています
ここでプロバイダーとはGPSやネットワークのことを指しています
- onLocationChanged:位置情報が更新されたときに呼び出される
- onStatusChanged:プロバイダーが状態が変わった時に呼び出される
- onProviderEnabled:プロバイダーが有効化したときに呼び出される
- onProviderDisabled:プロバイダーが無効化したときに呼び出される
onLocationChange,onStatusChangeメソッド
Log.eはデバック用、ここのメソッドに入りましたみたいなログを残すもの。
プロバイダーの状態は三つあり、
完全に圏外、一時的に利用できない、利用できますとなっている。
それぞれの状態に分岐させメッセージをだしている。
利用可能だとrequestLocationUpdartesメソッドを呼び出している。
onProviderEnabled,onProviderDisabledメソッド
プロバイダーが利用可能、不可能の時に呼び出されるメソッド
if文の中は必ずtrueとなる。
ここまで実装できたら
onCreateメソッドから作っていきます
onCreateメソッド
今回はLocationManager型のオブジェクトを作って
requestLocationUpdatesというメソッドを呼び出します
このgetSystemServiceはお決まりの文章なので魔法の言葉として使っておきます。
ここで、LocationManagerの変数を説明しておきます。
ここが三日間も躓いていたポイントで本当に何も考えず写経のように参考サイトをみてサンプルソースをカタカタ打ってちゃだめだと思いました笑。
- provider : String型の変数でLocationManager.GPS_PROVIDERかLocationManager.NETWORK_PROVIDERが中にはいる。
- minTime:位置情報を更新する最短時間、ミリ秒してい
- minDistance:位置情報を更新する距離、メートル指定
このproviderのなかのLocationManager.GPS_PROVIDERを今回はつかいます。
僕はずっとLocationManager.NETWORK_PROVIDERと打っていたのでずっと位置情報を取得することができずに非常に悩みました。
それも、そのはずで、NETWORKから位置情報を取得するpermissionを打ってないので、かならず、isNetworkEnableが必ずfalseになって大変苦労しました。当たり前のことですww
requestLocationメソッド
ここが今回肝になるメソッド
エラーが出てますが、ここのエラーの内容は
「ユーザ側によってはこのメソッドは拒否されます」
みたいな警告文です。ようはこのアプリケーションがかってに起動させていいだけのメソッドではないです。
(プライバシーとかの関係とか)
気にしなくてもいいです。
このエラー文章に翻弄されました笑
permissionの問題なのかと思ってマニフェストとかずっと確認してたけど、まぁ、赤線はひかれっぱですw
GPSから位置情報を取得する場合は必ずGPS_PROVIDERと絶対にうってください
showメソッド
ここはテキストエディタに表示させるだけのメソッドです。
緯度と経度、取得時間を取ってきて、それをそれぞれのテキストエディタにsetTextしていきます。
なので、今回必要なテキストエディタの数は
緯度と経度を取ってくるときは
それぞれgetLongitude,getLatitudeを使います。
ちなみに、layoutのmain.xmlはこんな感じ
さて、最後に実行するとこうなるはず
では、この緯度、経度をどこでエミュレータに疑似的に送ってあげるか
ここであります。
以上で位置情報を取得しました。
今回は時間かかったなぁ