この記事は Goodpatch Advent Calendar 2015 12日目の投稿です。
昨日は@aoshi さんによる「GitHubとSlackとの連携に便利なHubotプラグインを2つ紹介します」でした。
自己紹介 と Android エンジニアになった理由
はじめまして、Goodpatchでエンジニアをやっている @hayato-kです。
Javaエンジニアをそれなりにやっていた私ですが、現在弊社ではAndroidエンジニアが不足しており、Javaをやっていたことからちょっとやってみようかということではじめてみました。
実際なってみて数ヶ月、ちょっと躓いた箇所がありましたのでその部分についてお話ししようかと思います。
躓いた箇所
地図で現在地をGPSから取得し現在地へ移動するという処理を作っていた時のお話しになります。
現在の使用している端末で、位置情報が取得できていない状態から現在地の位置情報を取得できるように切り替えた時に現在地の取得がすぐにとれず現在地情報をGPSから取得するまで少し時間がかかってしまう所です。
使っていたメソッド
当初の実装では
getBestProvider
を使ってさくっと実装していました。
これはこれで楽に実装でき、GPSの取得における細かい設定もできるのでよいのですが、おおざっぱでもよいので、すぐの位置情報を取得したいという今回の場合だと合わなかった感じです。
他のやりかたを調査
他の方法で、すぐに現在地を取得できる方法がないか調べてみるとGPSから現在地を取得するまでに、端末によっては2、3分かかり、ネットワークから取得するのはそんなに時間がかからないということがわかりました。
ちなみに私が検証した端末は SOL22 の Android OS 4.2.2です
やってみる
調査した結果より、現在地を取得する方法を最初はネットワークで取得し、GPSで取得できるようであればGPSに切り替えて取得するというコードを実装しました。
private String selectProvider() {
String provider = "";
LocationManager locationManager = (LocationManager) getSystemService(this.LOCATION_SERVICE);
// ネットワーク取得
if(locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
Location locationNetwork = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (locationNetwork != null) {
provider = LocationManager.NETWORK_PROVIDER;
}
}
// GPS取得
if(locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
Location locationGPS = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if(locationGPS != null){
provider = LocationManager.GPS_PROVIDER;
}
}
return provider;
}
こんな感じですね。
ネットワークで取得、GPSで取得をそれぞれ行い精度の高いものを返します。
(もう少し条件文を減らしたいな・・・)
最後に
躓いたとっても解決できたので、個人的にはよかったです。
Android開発はJavaをやっていると内部コードはすんなり理解でき、やりやすいものなのでJavaのサーバーサイドを開発していて、Android開発をしていないという人は(している人も)是非やってみてください。
##
次回はGoodpatchのエンジニア @tanishi による 「Stripe」についてのお話しです。
それでは@tanishi さんよろしくです。