AltBeaconの実装方法＃領域監視

#AltBeaconとは
AltBeaconとは、AndroidでもiOSのiBeaconと同じような機能でBLEの信号を検出することができるようにするためのライブラリです。
BLEを使用するアプリにおいて、これまではiOSとAndroidでは検出方法が異なっていたためギャップが生じていましたが、このライブラリを使用することによりそのギャップを埋めることが出来ます。
>iBeaconとは
http://smartphone-ec.net/ibeacon/system.html

>AltBeaconサイト
http://altbeacon.org/

#準備
**1.ライブラリの導入**
以下よりライブラリを取得し、任意のプロジェクトに導入してください。
https://github.com/AltBeacon/android-beacon-library

**2.パーミッションの設定**
Bluetoothを使用するため、マニフェストにて以下パーミッションを許可しなければなりません。

```xml:Permission
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
```
任意ですが、対応していない機種にインストールされないようにuser-futureを設定することも重要です。

```xml:user-feature
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>
```

#領域監視の実装
それでは実装段階に移りますが、まずは領域監視の実装に入ります。
領域監視とは端末がBeacon検知領域に入ったかどうかを監視するもので、エリアの入退場を検知することができます。

**1.BluetoothManagerのインスタンス化**
まずはBluetoothManagerをインスタンス化します。BluetoothManagerはBeacon情報を管理するもので、Beacon検知の開始や停止、監視対象の設定ができます。

```java
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // インスタンス化
    BeaconManager mBeaconManager = BeaconManager.getInstanceForApplication(this);
```

**2.Parserの設定**
AltBeaconのデフォルト設定ではiBeaconを対象としていないので、Parserを設定する必要があります。

```java
String IBEACON_FORMAT = "m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24";
mBeaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout(IBEACON_FORMAT));
```

**3.Beaconサービスの接続と開始**
Beaconサービスと接続します（今回はActivityにBeaconConsumerを実装しています）

```java
public class MainActivity extends Activity implements BeaconConsumer {
    @Override
    public void onBeaconServiceConnect() {
    }
}
```
BeaconManager#bind()でサービスを開始します。※停止はunbind()

```java
@Override
protected void onResume() {
    super.onResume();
    mBeaconManager.bind(this); // サービスの開始
}

@Override
protected void onPause() {
    super.onPause();
    mBeaconManager.unbind(this); // サービスの停止
}
```

**4.領域監視の開始**
領域監視を開始するにはRegionの設定が必要です。

```java
mRegion = new Region("任意のユニークID", null, null, null);
```
Regionの第一引数には識別するIDを設定します。
第二、三、四引数で監視対象を選定する設定します。

```java
// uuidが"00000000-EE6E-2001-B000-005511DDAEGD"、
// major番号が"1"、minor番号が"9"のBeaconを監視する場合
Identifier uuid = Identifier.parse("00000000-EE6E-2001-B000-005511DDAEGD");
Identifier major = Identifier.parse("1");
Identifier minor = Identifier.parse("9");
mRegion = new Region("任意のユニークID", uuid, major, minor);
```
BeaconManager#startMonitoringBeaconsInRegion()でBeaconの監視を開始します。

```java
@Override
public void onBeaconServiceConnect() {
    try {
        // ビーコン情報の監視を開始
        mBeaconManager.startMonitoringBeaconsInRegion(mRegion);
    } catch (RemoteException e) {
        e.printStackTrace();
    }
}
```
またBeaconManager#stopMonitoringBeaconsInRegion()で監視を停止します。

```java
mBeaconManager.stopMonitoringBeaconsInRegion(mRegion);
```

**5.領域監視の設定**
サービスの開始により、領域監視の検知が開始されます。
検知情報を通知するため、領域監視の設定を行いましょう。
領域監視の通知を受け取るには、BeaconManager#setMonitorNotifier()を呼び出し、引数にMonitorNotifierというリスナーを設定します。

```java
@Override
public void onBeaconServiceConnect() {
    mBeaconManager.setMonitorNotifier(new MonitorNotifier() {
        @Override
        public void didEnterRegion(Region region) {
            // 領域への入場を検知
        }
 
        @Override
        public void didExitRegion(Region region) {
            // 領域からの退場を検知
        }
 
        @Override
        public void didDetermineStateForRegion(int i, Region region) {
            // 領域への入退場のステータス変化を検知
        }
    });
}
```
各リスナーに検知後の処理を実装することで、検知を確認することができます。

#まとめ
これでBeacon領域の入退場を検知することが出来たので、屋内への入退場を検知するアプリもこれで作ることができます。

しかしiBeaconの機能としてはまだまだ不十分です。
更なる機能の実装については次回に解説したいと思います。
#####[次回（AltBeaconの実装方法＃Beacon情報の取得、他）](http://qiita.com/a_nishimura/items/70da2ead8bf019bdd52e)