Nearby Messages 是一个发布-订阅 API,可让附近的设备交换小数据载荷。设备发布消息后,附近的设备便可接收该消息。本指南将向您介绍您的应用必须实现的所有功能,才能使用 Nearby Messages API 发布消息和订阅消息。
一组附近设备由通过蓝牙交换的小令牌决定。当设备检测到附近设备发送的令牌时,它会将令牌发送到附近消息服务器进行验证,并检查是否有任何消息要传送给应用的当前订阅集。
应用可以控制用于设备发现的一组媒介,以及这些媒介是否用于广播令牌和/或扫描令牌。默认情况下,系统会对所有媒介进行广播和扫描。如需对子集或媒介进行发现,以及控制是广播还是扫描,您必须在创建发布和订阅时传递其他参数。
在积极发布和订阅时,系统会显示“附近功能正在使用”通知,告知用户附近功能处于活跃状态。只有当一个或多个应用正在使用“附近”功能时,系统才会显示此通知,以便用户在不需要“附近”功能时节省电量。它为用户提供了以下选项:
- 前往要停用“附近”功能的应用。
- 强制应用停止使用“附近分享”。
- 前往附近分享设置界面。
您可以使用 PublishCallback()
和 SubscribeCallback()
监听用户强制应用停止使用附近分享的情况。发生这种情况时,系统会触发 onExpired()
方法。
由于附近消息 API 可能会影响电池续航时间,因此应仅在前台 activity 中使用这些 API(BLE 后台订阅除外)。
调用 publish()
和/或 subscribe()
即可使用 Nearby Messages API。您的应用应始终在 onStop()
中对称地 unpublish()
和 unsubscribe()
。
@Override
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()));
}
}
mMessage = new Message("Hello World".getBytes());
}
@Override
public void onStart() {
super.onStart();
...
Nearby.getMessagesClient(this).publish(mMessage);
Nearby.getMessagesClient(this).subscribe(mMessageListener);
}
@Override
public void onStop() {
Nearby.getMessagesClient(this).unpublish(mMessage);
Nearby.getMessagesClient(this).unsubscribe(mMessageListener);
...
super.onStop();
}
发布消息
如需发布消息,请调用 Nearby.getMessagesClient(Activity).publish()
并传递消息字节数组。我们建议将消息大小控制在 3KB 以下,这样我们可以更快地传送这些消息;不过,对于需要更大消息大小的应用,我们最多支持 100KB。此服务不适用于交换较大的对象,例如照片和视频。
您可以选择调用 PublishOptions.setStrategy()
来设置要使用的策略。
以下示例演示了如何调用 publish()
来发送一条小文本消息:
private void publish(String message) {
Log.i(TAG, "Publishing message: " + message);
mActiveMessage = new Message(message.getBytes());
Nearby.getMessagesClient(this).publish(mActiveMessage);
}
取消发布消息
如需取消发布消息,请调用 unpublish()
。您的应用至少应在其 onStop()
方法中调用 unpublish。传递用于发布的相同 Message
对象(在此示例中为 mActiveMessage
)。
以下代码示例展示了如何调用 unpublish()
:
private void unpublish() {
Log.i(TAG, "Unpublishing.");
if (mActiveMessage != null) {
Nearby.getMessagesClient(this).unpublish(mActiveMessage);
mActiveMessage = null;
}
}
订阅消息
如需订阅来自其他设备的消息,请调用 Nearby.getMessagesClient(Activity).subscribe()
。您需要传递 MessageListener
来处理接收已订阅的消息。
您可以选择调用 SubscribeOptions.setStrategy()
来设置要使用的策略。
以下示例演示了如何订阅消息:
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.");
Nearby.getMessagesClient(this).subscribe(mMessageListener, options);
}
退订
如需退订并停止接收设备消息,请调用 Nearby.getMessagesClient(Activity).unsubscribe()
。传递用于订阅的相同 MessageListener
对象(在此示例中为 mMessageListener
)。
以下代码示例演示了如何取消订阅:
private void unsubscribe() {
Log.i(TAG, "Unsubscribing.");
Nearby.getMessagesClient(this).unsubscribe(mMessageListener);
}