Android:現在地情報を取得する方法を修正

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


タグ Android | パーマリンク.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です