地図ロイドの現在位置機能(GPS)がHTC Desire(Android 2.1)でうまく動かないらしいということで,いくつか試行錯誤したメモです.ただし,まだ完全には解決していないようです.

DesireのGPS取得での試行錯誤

LocationManager.getBestProviderの不具合

GPSのLocationProviderを取得するのに, LocationManager.GPS_PROVIDERを直接使わずに, LocationManager.getBestProvider()を使って「最も位置が正確なプロバイダー」を取得していたのですが, この方法では,DesireでGPS_PROVIDERが取得できなかったようです.

以下のAndroidの不具合だと思われます.

回避策は簡単で,そんな回りくどいことをせずにLocationManager.GPS_PROVIDERを直接使えばいいだけです. もちろん当然,実際に有効かどうかをLocationManager.isProviderEnabled()でチェックしてから使う必要はあります.

この対応で,GPSを使ってくれる(GPSマークがピコピコする)ようにはなったのですが...

onLocationChangedが発生しない?

どうも,
// 位置検索を始動する
LocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
みたいな感じで位置検索を始動しても,位置検出イベントonLocationChangedが発生しないようでした. もちろん衛星が無い場所だと発生しないのですが,そういう場所でも無いようです.

この問題は解決できていないのですが,以下の対応である程度改善はしているようです.

// 初期化時.PARTIAL_WAKE_LOCKの準備をする
PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
WakeLock wakelock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, this.getClass().getName());

// GPS使用開始時.PARTIAL_WAKE_LOCKを取得する
wakelock.acquire();

// 試しにgetLastKnownLocationしてみる
LocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

// 位置検索を始動する
LocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, this);

 ・・・
// GPS使用終了時.PARTIAL_WAKE_LOCKを解放する
LocationManager.removeUpdates(this);
wakelock.release();
変更したのは以下の3点です
  1. LocationManager.requestLocationUpdates()で指定する検出間隔(msec,m)を「0,0」から「1000,1」に変えた
  2. requestLocationUpdatesの前に,getLastKnownLocationを呼び出すようにした
  3. GPS使用している間は,PARTIAL_WAKE_LOCKを取得しておくようにした

ただし3.については,少なくとも1.6ではGPS検索中は自動的にPARTIAL_WAKE_LOCKを取得しているようなので, いまいち腑に落ちないところではあります.(かといって他の2点も,全然腑に落ちないのですが...)

まぁ,結果オーライという感じです.

HTC Desireの再現する実機が手元にあれば,もう少し切り分けできるのですが,無いので実際に何が効果があるのかわかっていない状況です.

これ以上改善するには,一般的なGPSトラッキングアプリのように,GPSを裏で起動しっぱなしにするぐらいしか思いつかないのですが, 地図ロイドの電池節約の方針とは合わないので,悩ましいところです.

参考

kamolandをフォローしましょう


© 2021 KMIソフトウェア