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 ;
}
}
}
}
|