アプリは、他の近くのデバイスによって公開されたメッセージを定期購読するために使用されるメカニズムを使用して、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)
。
ビーコン メッセージの解析
ビーコンの添付ファイル は、ビーコンに追加できる任意のデータの塊です。 各アタッチメントは、次の部分で構成されています。
- Namespace: 名前空間識別子。
- タイプ: データのタイプ。
- Data: アタッチメントのデータ値。
次のコード スニペットは、メッセージ リスナーを使用して メッセージの例:
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 を使用します。