読者です 読者をやめる 読者になる 読者になる

HONDAのAndroid アプリ, Web アプリ開発忘備録

このブログはHONDAがAndroidアプリの開発開始と同時に作成したもので忘備録として記しています。最近Web系に就職が決まったのでwebアプリも勉強していきます。

GPSで位置情報を取得する

最近ずっと忙しくて更新できずでした。

TAやら成果発表を聴きに行ったり, 自分の研究をしたりで;

あと今回紹介するGPS取得が非常にてこずってました(三日間くらい調べてました)

今できたので書いていこうかと思います。

 

 

目的:GPSをつかって位置情報を取得する

ということでGPSを使って位置情報(経度、緯度)を取得していきます。

リファレンスは

tech.admax.ninja

これをみても随分手こずったので本当にややこしいかと;

まず、必ずandroid manifestで打たなければならない許可文を紹介します

f:id:havoc0214:20150907025811p:plain

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"/>

 

処理の流れ

処理の流れは以下のようになっています

f:id:havoc0214:20150907031351p:plain

まず初めに

LocationListenerをimplementします。

f:id:havoc0214:20150907032215p:plain

implementsするとLocationListenerは四つのメソッドを持っています

ここでプロバイダーとはGPSやネットワークのことを指しています

  • onLocationChanged:位置情報が更新されたときに呼び出される
  • onStatusChanged:プロバイダーが状態が変わった時に呼び出される
  • onProviderEnabled:プロバイダーが有効化したときに呼び出される
  • onProviderDisabled:プロバイダーが無効化したときに呼び出される

     

onLocationChange,onStatusChangeメソッド

Log.eはデバック用、ここのメソッドに入りましたみたいなログを残すもの。

プロバイダーの状態は三つあり、

完全に圏外、一時的に利用できない、利用できますとなっている。

それぞれの状態に分岐させメッセージをだしている。

利用可能だとrequestLocationUpdartesメソッドを呼び出している。

f:id:havoc0214:20150907033857p:plain

onProviderEnabled,onProviderDisabledメソッド

プロバイダーが利用可能、不可能の時に呼び出されるメソッド

if文の中は必ずtrueとなる。

f:id:havoc0214:20150907033926p:plainここまで実装できたら

onCreateメソッドから作っていきます

onCreateメソッド

f:id:havoc0214:20150907033354p:plain

今回は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メソッド

ここが今回肝になるメソッド

エラーが出てますが、ここのエラーの内容は

「ユーザ側によってはこのメソッドは拒否されます」

みたいな警告文です。ようはこのアプリケーションがかってに起動させていいだけのメソッドではないです。

(プライバシーとかの関係とか)

気にしなくてもいいです。

このエラー文章に翻弄されました笑

f:id:havoc0214:20150907033954p:plain

 

permissionの問題なのかと思ってマニフェストとかずっと確認してたけど、まぁ、赤線はひかれっぱですw

GPSから位置情報を取得する場合は必ずGPS_PROVIDERと絶対にうってください

showメソッド

ここはテキストエディタに表示させるだけのメソッドです。

緯度と経度、取得時間を取ってきて、それをそれぞれのテキストエディタにsetTextしていきます。

なので、今回必要なテキストエディタの数は

  • 緯度:longtitude
  • 経度:latitude
  • プロバイダーの種類:provider(GPS or NETWORK)
  • 利用状態:(True or False)
  • エラー文:動いてる時は表示しない。

f:id:havoc0214:20150907033938p:plain

f:id:havoc0214:20150907041213p:plain

緯度と経度を取ってくるときは

それぞれgetLongitude,getLatitudeを使います。

ちなみに、layoutのmain.xmlはこんな感じ

f:id:havoc0214:20150907041759p:plain

さて、最後に実行するとこうなるはず

f:id:havoc0214:20150907041829p:plain

では、この緯度、経度をどこでエミュレータに疑似的に送ってあげるか

 

f:id:havoc0214:20150907041907p:plain

ここであります。

 

以上で位置情報を取得しました。

今回は時間かかったなぁ

f:id:havoc0214:20150907041954j:plain