Help us understand the problem. What is going on with this article?

AltBeaconの実装方法#領域監視

More than 3 years have passed since last update.

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を使用するため、マニフェストにて以下パーミッションを許可しなければなりません。

Permission
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

任意ですが、対応していない機種にインストールされないようにuser-futureを設定することも重要です。

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

領域監視の実装

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

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

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

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

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を実装しています)

public class MainActivity extends Activity implements BeaconConsumer {
    @Override
    public void onBeaconServiceConnect() {
    }
}

BeaconManager#bind()でサービスを開始します。※停止はunbind()

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

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

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

mRegion = new Region("任意のユニークID", null, null, null);

Regionの第一引数には識別するIDを設定します。
第二、三、四引数で監視対象を選定する設定します。

// 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の監視を開始します。

@Override
public void onBeaconServiceConnect() {
    try {
        // ビーコン情報の監視を開始
        mBeaconManager.startMonitoringBeaconsInRegion(mRegion);
    } catch (RemoteException e) {
        e.printStackTrace();
    }
}

またBeaconManager#stopMonitoringBeaconsInRegion()で監視を停止します。

mBeaconManager.stopMonitoringBeaconsInRegion(mRegion);

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

@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情報の取得、他)
aivick
創意工夫でお客様の課題を解決し続ける古都京都のシステム開発会社です。ベンチャー精神を忘れず、ヘルスケア業界に革新をもたらす新サービスの実現も目指しています。
https://www.aivick.co.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした