Androidアプリ、計画停電情報で、現在地の取得が遅い!取れない!と結構言われていました。自分のテストでは取れていたのですが、なんかおかしそうだったので、今回修正しました。
まぁ決まって言われるのは、「Google Mapsならすぐ取れるんですが」なんですよ。それはわかってます、と…。Mapを使えば、MyLocationOverlayが使えるから、取りやすいのかなと思ってはいたけれど、開発当初は、Mapを使わないでいいようにしようと思っていたから、敢えてonLocationChangedだけで勝負していたわけです。でもダメっぽかった…。取れる人は取れるけど、取れない人は取れないという…。
地図機能を追加したから、MyLocationOverlayを使った方法にしようと思って修正しました。そのときに使ったコードの一部を公開しときます。全部見たい人はgithubからとってくださいw
まぁ具体的にはMyLocationOverlayを継承して、MyLocationOverlay側のonLocationChangedに処理を追加したという感じです。これ便利ですねー、ほんと。
// MapActivityを継承したclassのprivate class /** * 現在地を取得したらその場所に移動する機能をもったオーバーレイ * 呼び出し元のActivityから現在地を取得ボタンを押された場合のみ、そのような動作をする */ private class CustomMyLocationOverlay extends MyLocationOverlay { /** 呼び出し元から現在地取得が押されて呼ばれたかのフラグ */ private boolean isMyLocationRequestByTop; /** 初回表示時に、マップを現在地に移動させるフラグ */ private boolean isFirst = true; public void setIsMyLocationRequestByTop(boolean requestByTop) { this.isMyLocationRequestByTop = requestByTop; } public CustomMyLocationOverlay(Context context, MapView mapView) { super(context, mapView); } @Override public synchronized void onLocationChanged(Location location) { super.onLocationChanged(location); if (isFirst) { isFirst = false; GeoPoint p = getMyLocation(); mGeoPoint = p; mMapController.animateTo(mGeoPoint); // ピンのオーバーレイを設定するメソッド setOverlay(mGeoPoint); if (isMyLocationRequestByTop){ isMyLocationRequestByTop = false; mProgress.dismiss(); // 現在地が取得できたので、現在地情報を設定して // 呼び出し元のActivityに戻すメソッドを呼び出す callFinish(); } } } }
計画停電情報のDL数も13万くらいになってきました。
もっと使いやすいアプリにできるように頑張りたいと思います。