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万くらいになってきました。
もっと使いやすいアプリにできるように頑張りたいと思います。
