Ricevere messaggi beacon

La tua app può abbonarsi agli allegamenti beacon Bluetooth Low Energy (BLE) usando lo stesso meccanismo usato per sottoscrivere i messaggi pubblicati altri dispositivi nelle vicinanze. Quando ti abboni, la tua app riceverà automaticamente messaggi provenienti sia da beacon che da dispositivi nelle vicinanze.

Iscriviti ai messaggi beacon BLE

您的应用可以通过两种方式订阅 BLE 信标消息:

  • 前台,响应用户操作 或事件
  • 在后台运行时, 未运行。

在前台订阅

当您的应用在前台订阅信标消息时,扫描将 直到您的应用退订为止仅启动前台 订阅(通常是为了响应用户操作)。

您的应用可以通过调用 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 字符串进行编码,但信标消息 对其他字节格式(例如序列化协议缓冲区)进行编码。 如需了解详情,请参阅向信标添加附件

Per scoprire quali spazi dei nomi sono associati al tuo progetto, chiama namespaces.list.

Note: