sos の 作業メモ

プログラミングや英会話学習、マイルや旅行、日常生活など。最近はWebFormなASP.NETのお守りがお仕事です。

日々の生活にhappyをプラスする|ハピタス Gポイント

Google Play services Location APIを利用して位置情報を継続的にとるためのクラスの実装例

I/Oで発表された直後にも記事を書きましたが ようやく真面目に利用する機会が来たので、たいしたもんじゃありませんがざっと実装してみました。

サービスが切断された時の再接続処理のとっかかりとか書いてますが、もっとちゃんと状態を監視しないとやばいんじゃないかなとか思ったりもしつつ、とりあえずこれで様子見。

測位間隔や精度なんかを引数で渡せるようにするとか、いろいろ改良するともっと使いやすくなると思います。

com.google.android.gms.maps.LocationSource をimplementしちゃって、独自に位置データを処理しつつ、ついでにGoogleMapに現在位置を供給するクラスに仕立てたりとかもいいかも?

それを組み込んだMapFragmentを書いてみました
201308版 Google Maps Android API v2で現在位置をフォロー - sos の 作業メモ

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.location.LocationClient;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import static com.google.android.gms.common.GooglePlayServicesClient.ConnectionCallbacks;
import static com.google.android.gms.common.GooglePlayServicesClient.OnConnectionFailedListener;

public class LocationListenerImpl implements LocationListener, ConnectionCallbacks, OnConnectionFailedListener {
    private LocationClient mLocClient = null;
    private boolean mReconnect = false;

    public LocationListenerImpl(Context context) {
        mLocClient = new LocationClient(context, this, this);
    }

    public void start() {
        if (!mLocClient.isConnected() && !mLocClient.isConnecting()) {
            mReconnect = false;
            mLocClient.connect(); // 接続開始
        }
    }

    public void stop() {
        mReconnect = false;
        mLocClient.removeLocationUpdates(this); // LocationListenerを解除
        mLocClient.disconnect(); // 切断
    }

    @Override
    public void onConnected(Bundle bundle) {
        // Locationサービスとの接続が完了
        mReconnect = true; // onDisconnected時に再接続を行うようにフラグを立てる
        // 5秒間隔、最小の移動距離1mで高精度の測位を行うように設定
        LocationRequest req = LocationRequest.create();
        req.setFastestInterval(5000);
        req.setInterval(5000);
        req.setSmallestDisplacement(1);
        req.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        mLocClient.requestLocationUpdates(req, this);
    }

    @Override
    public void onDisconnected() {
        if (mReconnect)
            start(); // 意図しない切断のため再接続を試みる
    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        // Locationサービスへの接続に失敗したため、ユーザーへアラート表示等を行う
    }

    @Override
    public void onLocationChanged(Location loc) {
        // 位置情報が続々とやってくるので、ここで位置情報を利用する処理を行う
    }
}

使い方はとても簡単、インスタンスを作って startで開始、stopで停止。

LocationListenerImpl locListner = new LocationListenerImpl(this);
locListener.start(); // 測位開始
locListener.stop(); // 測位終了

ちなみに、どーゆーときにサービスが止まって、実際にどんな風な挙動になるのか等まだちゃんと調査してません。とりあえずドキュメントに書いてあることを頼りに実装してますが、たぶん実機だともっといろいろおかしな動きをしそうですね…

その辺の詳しい方がおられましたら、ぜひ教えてください(^^;