ベストでないgetBestProvider

id:yellow_73:20110815#p1 のつづき。
LocationManager#getBestProvider() を使うと、Criteriaで指定した優先順位に沿って最も適切なロケーションプロバイダを探してくれるというものです。メソッド名からして「ベスト」なんだしこれで良いと思ってました。
しかしどっこい、ベストとは言えない事例が出てきました。
プライベートでマーケットに放流しているもののうち低評価な方のアプリについて、南米あたりから「他のアプリではGPSが使えるけど、このアプリでは位置特定できないよー」というメールを頂きました。
しばらく考えて、ふと思いついたので実験してみました。

ネットワークにつながってない状態でネットワーク位置特定はできない

Androidの「位置情報とセキュリティ」設定でネットワーク位置特定にもGPS位置特定にもチェックを入れ、SIM抜いて、無線LAN切って、某アプリを立ち上げました。
結果は、予想通り、位置特定はできませんでした。
次に、ネットワーク位置特定のチェックを外し、GPSのみにチェックが入った状態にして、某アプリを起動。
こちらは、位置特定ができました。
この二つのことから、ネットワークにつながってない状態でも getBestProvider() は、設定を見て、ネットワーク位置特定を試みようとしていたと考えられます。
つまり、環境によっては、最適なロケーションプロバイダを選んだつもりが、最悪なものを選ぶこともある、ということです。

本当にそういうケースってあるの?

たぶん、あります。
通信ユニットを持たないタブレットとか、携帯でも不意な通信に起因する通信費をセーブするためにSIMを抜くとか、平気でやりますね。これで携帯電話回線を切ったうえで、無線LANの電波が届かないと、ネットワークに当然つながりません。
ちなみにレポートメールを送って下さった方は、Galaxy Pro をお使いのようなので、SIM抜いてるんじゃないかと思ってます。

解決策(保留)

最も簡単な回避策はネットワーク位置特定を切ってもらうこと。ただ、無線LANを使ってる人にとっては、アクセスポイントを拾うたびに設定の切り替えが必要になり、面倒な気がします。少なくとも私はやりたくない。
やはり、あれかな、と。getBestProvider()で最適と思われるプロバイダで20秒ほど受信して、それでもダメなら、ほかのプロバイダに切り替えて位置特定を続行させる必要があるかなーと。