Android 位置情報の精度を決める
Android SDK 20
APIターゲット 8
で開発しています
Androidの位置情報は色々な形で取得できますが、2012年8月現在、ほぼ下記の2つがメインで取得できます。
- GPS
- Network(無線LANなどの位置情報)
- GPSを取得するのはバッテリーの消費が早いけれども精度が高い、屋内でなかなか取得できない
- Networkはバッテリーの消費が遅いけれども精度が低い Networkさえあれば屋内でも取得できる
という特長があります。
位置情報を提供してくれるGPSやNetworkをプロバイダと呼んでいます。
実際にプログラムの中で指定するには、criteriaという仕組みを使います。
criteria って聞きなれない言葉ですよねー。基準、という意味だそうです。
//バッテリー消費を犠牲にしても、精度が高いものがほしい場合 mgr = (LocationManager) getSystemService(LOCATION_SERVICE); criteria = new Criteria(); criteria.setAccuracy(Criteria. ACCURACY_FINE ); //best_providerは大体の場合GPSになります String best_provider = mgr.getBestProvider(criteria, true);
//とにかくバッテリー消費が気になる場合、精度を犠牲にする criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_COARSE); criteria.setPowerRequirement(Criteria.POWER_LOW ); //best_providerは大体の場合Networkになります String best_provider = mgr.getBestProvider(criteria, true);
試してみているかぎりではGPSもNetworkもどちらもその時に応じて使えた方がいいと思います。
何も指定しない、というのもできます。
//その時に応じて、つかんだ位置情報プロバイダを選択 criteria = new Criteria(); criteria.setAccuracy(Criteria.NO_REQUIREMENT); //best_providerは大体の場合Networkになります String best_provider = mgr.getBestProvider(criteria, true);
移動しながら利用する場合は、移動したらベストな位置情報プロバイダを選択するのがよいでしょう。
移動しながらベストなプロバイダを切り替えるやり方を、Google のReto Meierさんが、下記に書いています。
ベストプラクティスとして、とても参考になるので、Android位置情報アプリを作る人は読んでみてもよいと思います。
http://android-developers.blogspot.jp/2011/06/deep-dive-into-location.html