【Android】位置情報取得でonLocationChangedが呼ばれない現象を改善する

Androidアプリで位置情報を取得するためにlocationManager.requestLocationUpdatesを実行しているのですが、
GPSの効かない屋内で一向にonLocationChangedが呼び出されず位置情報が取得できない。

もういい加減FusedLocationProviderClientを使えよという話かもしれませんが、今から変えるのも結構コストがかかるので既存をあまり変えないことを前提にしつつ…
何がいけないのかといろいろ調べた末にたどり着いた結論がこちら。

providerをgetBestProviderで取得するのをやめる。

以前はこんなふうにproviderNameをgetBestProviderで取得していました。
これでGPSが有効ならGPS_PROVIDERがproviderNameとして返ります。

String providerName = locationManager.getBestProvider(criteria, true);
locationManager.requestLocationUpdates(providerName, 300, 1, this);

しかし、これだと屋内のときにGPSが信号を受信せずにうまく動作せず、
NETWORK_PROVIDERなら取得できたはずの位置情報が取得できなくなってしまいます。

requestLocationUpdatesを二度投げる

Android Developersのサイトによると、

You can also request location updates from both the GPS and the Network Location Provider
by calling requestLocationUpdates() twice—once for NETWORK_PROVIDER and once for GPS_PROVIDER.

とのことで、NETWORK_PROVIDERとGPS_PROVIDERの二度投げは許されるとのことでした。
というわけで、

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 300, 1, this);
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 300, 1, this);

することで、GPSの効かない屋内でも無事に位置情報が取得できるようになりました。

Lolipopで位置情報が取得できない場合がある?

検証端末で調べていたところ、1台どうしても位置情報が取得できない端末がありました。

この端末はsimを抜いており、バージョンは5.0。
調べてみると、同じような現象が発生している人がいるようなので、こればかりはどうしようもないのかもしれない…


投稿日

カテゴリー:

投稿者:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください