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クラスの主なセットモジュール
メソッド | 内容 |
---|---|
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を登録します。
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; } } } }
0 件のコメント:
コメントを投稿