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 件のコメント:
コメントを投稿