GeoFenceの登録は次のような手順で行います。
1. LocationClientクラスのconnectメソッドをコールして、Location Serviceに接続2. 接続完了後、addGeofencesメソッドをコールして、GeoFenceを登録
3. 登録結果をOnAddGeofencesResultListenerリスナーのonAddGeofencesResultメソッドで受け取る
GeoFenceのデータを生成する
addGeofencesメソッドの引数にセットするGeoFenceデータを生成します。データ生成はGeofence.Builderクラスを使用します。(※GeoFenceDataクラスはアプリケーション内に定義したデータクラス)
1 2 3 4 5 6 7 8 9 10 11 | 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クラスの主なセットモジュール
メソッド | 内容 |
---|---|
setCircularRegion | GeoFenceの領域を指定 |
setExpirationDuration | 有効期間を指定(自動的に削除されるまでの時間)、自動削除をしない場合はNEVER_EXPIREを指定 |
setLoiteringDelay | GeoFence指定領域に入ってから留まると判定するまでの時間(ms)を指定 |
setNotificationResponsiveness | GeoFenceから通知を受ける際の応答性 |
setRequestId | GeoFenceのIDを指定 |
setTransitionTypes | transition 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を登録します。
1 2 3 4 5 6 7 8 9 10 11 12 | 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から判定できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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で受け取る例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | 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 ; } } } } |
0 件のコメント:
コメントを投稿