ビーコン メッセージを受信する

アプリは、付近の他のデバイスによってパブリッシュされるメッセージをサブスクライブする場合と同じメカニズムを使用して、Bluetooth Low Energy(BLE)ビーコン アタッチメントをサブスクライブできます。サブスクライブすると、アプリはビーコンと付近のデバイスの両方からメッセージを自動的に受信します。

BLE ビーコン メッセージをサブスクライブする

アプリが BLE ビーコンメッセージに登録する方法は 2 つあります。

フォアグラウンドでの登録

アプリがフォアグラウンドでビーコン メッセージをサブスクライブすると、アプリがサブスクライブ解除されるまでスキャンが継続的に実行されます。フォアグラウンド サブスクリプションは、アプリがアクティブである場合にのみ(通常はユーザーのアクションに応じて)開始してください。

アプリは、Nearby.getMessagesClient(Activity).subscribe(MessageListener, SubscribeOptions) を呼び出して Strategy オプションを BLE_ONLY に設定することで、フォアグラウンド サブスクリプションを開始できます。

次のコード スニペットは、フォアグラウンド サブスクリプション Nearby.getMessagesClient(Activity).subscribe(MessageListener, SubscribeOptions) を開始する方法を示しています。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    mMessageListener = new MessageListener() {
        @Override
        public void onFound(Message message) {
            Log.d(TAG, "Found message: " + new String(message.getContent()));
        }

        @Override
        public void onLost(Message message) {
            Log.d(TAG, "Lost sight of message: " + new String(message.getContent()));
        }
    }
}

// Subscribe to receive messages.
private void subscribe() {
    Log.i(TAG, "Subscribing.");
    SubscribeOptions options = new SubscribeOptions.Builder()
            .setStrategy(Strategy.BLE_ONLY)
            .build();
    Nearby.getMessagesClient(this).subscribe(mMessageListener, options);
}

サブスクリプションが不要になった場合は、Nearby.getMessagesClient(Activity).unsubscribe(MessageListener) を呼び出して、アプリの登録を解除する必要があります。

バックグラウンドで定期購入

アプリがバックグラウンドでビーコン メッセージをサブスクライブすると、アプリがアクティブでない場合でも、画面がオンになったときに低電力スキャンがトリガーされます。このスキャン通知を使用すると、特定のメッセージに応じてアプリを「復帰」させることができます。バックグラウンド サブスクリプションは、フォアグラウンド サブスクリプションよりも消費電力が少なくなりますが、レイテンシと信頼性が低下します。

アプリは、Nearby.getMessagesClient(Activity).subscribe(PendingIntent, SubscribeOptions) を呼び出して Strategy オプションを BLE_ONLY に設定することにより、バックグラウンド サブスクリプションを開始できます。

次のコード スニペットは、Nearby.getMessagesClient(Activity).subscribe(PendingIntent, SubscribeOptions) を呼び出してバックグラウンド サブスクリプションを開始する方法を示しています。

// Subscribe to messages in the background.
private void backgroundSubscribe() {
    Log.i(TAG, "Subscribing for background updates.");
    SubscribeOptions options = new SubscribeOptions.Builder()
            .setStrategy(Strategy.BLE_ONLY)
            .build();
    Nearby.getMessagesClient(this).subscribe(getPendingIntent(), options);
}

private PendingIntent getPendingIntent() {
    return PendingIntent.getBroadcast(this, 0, new Intent(this, BeaconMessageReceiver.class),
            PendingIntent.FLAG_UPDATE_CURRENT);
}

次のコード スニペットは、BeaconMessageReceiver クラスでインテントを処理する方法を示しています。

@Override
public void onReceive(Context context, Intent intent) {
    Nearby.getMessagesClient(context).handleIntent(intent, new MessageListener() {
        @Override
        public void onFound(Message message) {
            Log.i(TAG, "Found message via PendingIntent: " + message);
        }

        @Override
        public void onLost(Message message) {
            Log.i(TAG, "Lost message via PendingIntent: " + message);
        }
    });
}

サブスクリプションが不要になった場合は、Nearby.getMessagesClient(Activity).unsubscribe(PendingIntent) を呼び出して、アプリの登録を解除する必要があります。

ビーコン メッセージを解析する

ビーコン添付ファイルは、ビーコンに追加できる任意のデータの blob です。各添付ファイルは次の要素で構成されます。

  • 名前空間: 名前空間識別子。
  • タイプ: データ型。
  • データ: アタッチメントのデータ値。

次のコード スニペットは、メッセージ リスナーを使用して BLE ビーコンから受信したメッセージを解析する方法を示しています。

mMessageListener = new MessageListener() {
    @Override
    public void onFound(Message message) {
        // Do something with the message here.
        Log.i(TAG, "Message found: " + message);
        Log.i(TAG, "Message string: " + new String(message.getContent()));
        Log.i(TAG, "Message namespaced type: " + message.getNamespace() +
                "/" + message.getType());
    }

    ...
};

コンテンツの解析はバイト形式によって異なります。この例では、コンテンツ バイトが UTF-8 文字列をエンコードしていることを前提としていますが、ビーコン メッセージは他のバイト形式(シリアル化されたプロトコル バッファなど)をエンコードできるものとします。詳しくは、ビーコンへの添付ファイルの追加をご覧ください。

プロジェクトに関連付けられている名前空間を確認するには、namespaces.list を呼び出します。

注:

  • バッテリーを節約するには、アクティビティの onStop() 関数で Nearby.getMessagesClient(Activity).unsubscribe() を呼び出します。これは、フォアグラウンドで登録する場合にのみ適用されます。
  • レイテンシを短縮するには、Nearby.getMessagesClient(Activity).subscribe() を呼び出すときに Strategy.BLE_ONLY オプションを使用します。このオプションを設定すると、Nearby Messages API は従来の Bluetooth スキャンをトリガーしません。これにより、可能性のあるスキャンタイプをすべて繰り返すわけではないため、ビーコン検出のレイテンシが改善されます。
  • メッセージ ペイロードをビーコンに添付するには、Proximity Beacon API を使用します。