ラベル GooglePlayServices の投稿を表示しています。 すべての投稿を表示
ラベル GooglePlayServices の投稿を表示しています。 すべての投稿を表示

2014年3月3日月曜日

GeoFenceの解除

GeoFenceの解除は次のような手順で行います。

1. LocationClientクラスのconnectメソッドをコールして、Location Serviceに接続
2. 接続完了後、removeGeofencesメソッドをコールして、GeoFenceを解除
3. 解除結果はOnRemoveGeofencesResultListenerリスナーで受け取る

removeGeofencesメソッドは2種類あり、GeoFenceのIDを指定(リクエストID)するメソッドとPendingIntentを指定するメソッドがあります。

public void removeGeofences(List<String> geofenceRequestIds,
                            LocationClient.OnRemoveGeofencesResultListener listener)

public void removeGeofences(PendingIntent pendingIntent,
                            LocationClient.OnRemoveGeofencesResultListener listener)


次はGeoFenceのIDを指定(リクエストID)して解除を行うプログラムです。

    @Override
    public void onConnected(Bundle bundle) {
        super.onConnected(bundle);

        Bundle fragmentBundle = getArguments();
        ArrayList<GeoFenceData> list = fragmentBundle.getParcelableArrayList(GEOFENCE_DATA);

        List<String> idList = new ArrayList<String>();
        for (GeoFenceData data : list) {
            idList.add(data.getId());
        }

        getLocationClient().removeGeofences(idList, mOnRemoveGeofencesResultListener);

    }


指定するクラスにより、OnRemoveGeofencesResultListenerリスナーの呼ばれるメソッドが異なります。

メソッド内容
onRemoveGeofencesByPendingIntentResultGeoFenceのID指定による削除用
onRemoveGeofencesByRequestIdsResultPendingIntent指定による削除用


次はonRemoveGeofencesByRequestIdsResultメソッドで結果を受け取るプログラムです。

    private OnRemoveGeofencesResultListener mOnRemoveGeofencesResultListener = new OnRemoveGeofencesResultListener() {

        @Override
        public void onRemoveGeofencesByPendingIntentResult(int statusCode,
                PendingIntent pendingIntent) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onRemoveGeofencesByRequestIdsResult(int statusCode, String[] geofenceRequestIds) {
            switch (statusCode) {
                case LocationStatusCodes.SUCCESS:
                    Toast.makeText(getActivity(), "LocationStatusCodes.SUCCESS", Toast.LENGTH_LONG)
                            .show();
                    break;
                case LocationStatusCodes.GEOFENCE_NOT_AVAILABLE:
                case LocationStatusCodes.GEOFENCE_TOO_MANY_GEOFENCES:
                case LocationStatusCodes.GEOFENCE_TOO_MANY_PENDING_INTENTS:
                case LocationStatusCodes.ERROR:
                    break;
                default:
                    break;
            }
            mLocationClient.disconnect();
            mOnGeoFenceRemoverInterface.onGeoFenceRemoved();
        }

    };

2014年3月2日日曜日

GeoFenceの登録

GeoFenceの登録は次のような手順で行います。

1. LocationClientクラスのconnectメソッドをコールして、Location Serviceに接続
2. 接続完了後、addGeofencesメソッドをコールして、GeoFenceを登録
3. 登録結果をOnAddGeofencesResultListenerリスナーのonAddGeofencesResultメソッドで受け取る


GeoFenceのデータを生成する

addGeofencesメソッドの引数にセットするGeoFenceデータを生成します。データ生成はGeofence.Builderクラスを使用します。(※GeoFenceDataクラスはアプリケーション内に定義したデータクラス)

    static public Geofence toGeofence(GeoFenceData data) {
        Builder builder = new Geofence.Builder();

        builder.setRequestId(data.getId());
        builder.setTransitionTypes(data.getTransition());
        builder.setCircularRegion(data.getLatitude(), data.getLongitude(),
                data.getRadius());
        builder.setExpirationDuration(data.getExpiration());

        return builder.build();
    }

Geofence.Builderクラスには次のようなセッターがあります。

表1.1: Geofence.Builderクラスの主なセットモジュール

メソッド内容
setCircularRegionGeoFenceの領域を指定
setExpirationDuration有効期間を指定(自動的に削除されるまでの時間)、自動削除をしない場合はNEVER_EXPIREを指定
setLoiteringDelayGeoFence指定領域に入ってから留まると判定するまでの時間(ms)を指定
setNotificationResponsivenessGeoFenceから通知を受ける際の応答性
setRequestIdGeoFenceのIDを指定
setTransitionTypestransition typesの指定

表1.2: Geofence.Builderクラスの主なセットモジュール

メソッド内容
GEOFENCE_TRANSITION_DWELL GeoFence指定領域に入って留まる
GEOFENCE_TRANSITION_ENTER GeoFence指定領域に入る
GEOFENCE_TRANSITION_EXIT GeoFence指定領域から出る

GEOFENCE_TRANSITION_DWELLをセットする場合、GeoFence指定領域に入ってから留まると判定するまでの時間を、setLoiteringDelayメソッドで指定する必要があります。



GeoFenceの登録をする

LocationClientクラスのconnectメソッドをコールし、Location Service接続後、LocationClientクラスのaddGeofencesメソッドを使用してGeoFenceを登録します。

    public void onConnected(Bundle bundle) {
        super.onConnected(bundle);

        Intent intent = new Intent(getActivity(), ReceiveTransitionsIntentService.class);
        mPendingIntent = PendingIntent.getService(
                getActivity(),
                0,
                intent,
                PendingIntent.FLAG_UPDATE_CURRENT);

        getLocationClient().addGeofences(mGeofences, mPendingIntent, mOnAddGeofencesResultListener);
    }

第2引数に、GeoFence指定領域に対しトランザクションが発生した場合に発行するPendingIntentをセットします。第3引数に、登録結果を受け取るOnAddGeofencesResultListenerリスナークラスをセットします。



登録の結果を受け取る

OnAddGeofencesResultListenerリスナークラスの例です。登録結果はstatusCodeから判定できます。

    private OnAddGeofencesResultListener mOnAddGeofencesResultListener = new OnAddGeofencesResultListener() {

        @Override
        public void onAddGeofencesResult(int statusCode, String[] geofenceRequestIds) {
            switch (statusCode) {
                case LocationStatusCodes.SUCCESS:
                    break;
                case LocationStatusCodes.GEOFENCE_NOT_AVAILABLE:
                case LocationStatusCodes.GEOFENCE_TOO_MANY_GEOFENCES:
                case LocationStatusCodes.GEOFENCE_TOO_MANY_PENDING_INTENTS:
                case LocationStatusCodes.ERROR:
                    break;
                default:
                    break;
            }
            mLocationClient.disconnect();
        }

    };


GeoFenceの通知

LocationClientクラスのaddGeofencesメソッドをコールする際、PendingIntentをセットしました。このPendingIntentをアプリケーションで受け取ります。次はIntentServiceで受け取る例です。

public class ReceiveTransitionsIntentService extends IntentService {

    public ReceiveTransitionsIntentService(String name) {
        super(name);
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        if (LocationClient.hasError(intent)) {

            int errorCode = LocationClient.getErrorCode(intent);
            android.util.Log.e("ReceiveTransitionsIntentService",
                    "Location Services error: " +
                            Integer.toString(errorCode));
        } else {
            int transitionType =
                    LocationClient.getGeofenceTransition(intent);
            List<Geofence> geofences = LocationClient.getTriggeringGeofences(intent);

            switch (transitionType) {
                case Geofence.GEOFENCE_TRANSITION_ENTER:
                    break;
                case Geofence.GEOFENCE_TRANSITION_EXIT:
                    break;
                default:
                    break;

            }

        }

    }
}

2014年2月20日木曜日

位置情報取得に利用するLocationClient

位置情報を取得するにはLocationManagerが提供されていますが、GPSとWiFiの設定に依存してLocationProviderの切り替えが必要でした。Google Play services APKが提供するLocation Serviceを使用すれば、Providerを考慮することなく位置情報を取得することができます。



Permissionの設定

Location Serviceを使用すには、AndroidManifest.xmlにPermissionの記載が必要です。LocationManagerと同様に、位置情報の精度に応じてPermissionが異なります。

 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>


LocationClientの接続

Location Serviceを使用するには、LocationClientクラスの生成が必要です。

 mLocationClient = new LocationClient(this, mConnectionCallbacks,
    mOnConnectionFailedListener);

第2引数にConnectionCallbacksインターフェイス、第3引数にOnConnectionFailedListenerインターフェイスをセットします。ConnectionCallbacksインターフェイスは、LocationClientがLocation Serviceに接続 / 切断した際にコールされます。OnConnectionFailedListenerは何らかのエラーが発生した場合にコールされます。

LocationClientの接続要求はLocationClient#connectメソッドをコールします。

     @Override
    protected void onStart() {
        super.onStart();
        if (isGooglePlayServicesAvailable()) {
            if (!mLocationClient.isConnected()) {
                mLocationClient.connect();
            }
        }
    }

接続に成功すると、mConnectionCallbacks#onConnectedがコールされます。



LocationRequestの生成

LocationClientの接続が成功した後に、requestLocationUpdatesメソッドをコールし位置情報の取得要求を行います。

 @Override
public void onConnected(Bundle bundle) {
    mLocationClient.requestLocationUpdates(mLocationRequest, mLocationListener);
}

第1引数にLocationRequestクラスを、第2引数にLocationListenerインターフェイスをセットします。LocationRequestクラスは次のようなセットモジュールを提供します。

メソッド内容
setInterval位置情報の更新間隔をmsで指定
setPriorityプライオリティ(精度)の指定
setExpirationDuration要求の期間(動作時間を)msで指定
setFastestInterval位置情報の最速更新間隔をmsで指定
setSmallestDisplacement最小移動距離をmで指定(指定メートル移動したら更新)


位置情報の取得

位置情報はmLocationListener#onLocationChangedメソッドにてAndroid OSから受け取ります。位置情報はLocationクラスとして取得します。

 private LocationListener mLocationListener = new LocationListener() {

    @Override
    public void onLocationChanged(Location location) {
    }

};


LocationClientの停止

位置情報の更新を停止するには、LocationClientクラスのremoveLocationUpdatesメソッドをコールしリスナーを解除します。続けて、disconnectメソッドをコールしLocation Serviceから切断します。

     @Override
    protected void onStop() {
        if (isGooglePlayServicesAvailable()) {
            if (mLocationClient.isConnected()) {
                mLocationClient.removeLocationUpdates(mLocationListener);
            }
            mLocationClient.disconnect();
        }
        super.onStop();
    }