Ihre App kann BLE-Beacon-Anhänge (Bluetooth Low Energy) mit demselben Mechanismus abonnieren, der auch zum Abonnieren von Nachrichten verwendet wird, die von anderen Geräten in der Nähe veröffentlicht wurden. Wenn du ein Abo abschließt, erhält deine App automatisch Nachrichten von Beacons und Geräten in der Nähe.
BLE-Beacon-Mitteilungen abonnieren
Es gibt zwei Möglichkeiten, BLE-Beacon-Nachrichten zu abonnieren:
- Im Vordergrund als Reaktion auf eine Nutzeraktion oder ein Ereignis.
- Im Hintergrund, wenn Ihre Anwendung nicht ausgeführt wird.
Im Vordergrund abonnieren
Wenn deine App Beacon-Nachrichten im Vordergrund abonniert, werden Scans kontinuierlich durchgeführt, bis deine App abbestellt wird. Starten Sie ein Vordergrund-Abo nur, wenn Ihre App aktiv ist, in der Regel als Reaktion auf eine Nutzeraktion.
Ihre App kann ein Vordergrund-Abo initiieren, indem sie Nearby.getMessagesClient(Activity).subscribe(MessageListener, SubscribeOptions)
aufruft und die Option Strategy
auf BLE_ONLY
setzt.
Das folgende Code-Snippet zeigt, wie ein Abo im Vordergrund gestartet wird 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);
}
Wenn das Abo nicht mehr erforderlich ist, sollte Ihre App durch Aufrufen von Nearby.getMessagesClient(Activity).unsubscribe(MessageListener)
beendet werden.
Im Hintergrund abonnieren
Wenn Ihre App Beacon-Nachrichten im Hintergrund abonniert, werden bei Bildschirmwarnhinweisen Scans mit geringem Energieverbrauch ausgelöst, auch wenn Ihre App derzeit nicht aktiv ist. Sie können diese Scanbenachrichtigungen verwenden, um Ihre App als Reaktion auf eine bestimmte Nachricht zu aktivieren. Hintergrundabos verbrauchen weniger Energie als Vordergrundabos, haben aber eine höhere Latenz und sind weniger zuverlässig.
Ihre App kann ein Hintergrundabo initiieren, indem sie Nearby.getMessagesClient(Activity).subscribe(PendingIntent, SubscribeOptions)
aufruft und die Option Strategy
auf BLE_ONLY
setzt.
Das folgende Code-Snippet zeigt, wie durch Aufrufen von Nearby.getMessagesClient(Activity).subscribe(PendingIntent, SubscribeOptions)
ein Hintergrundabo initiiert wird.
// 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);
}
Das folgende Code-Snippet zeigt, wie der Intent in der Klasse BeaconMessageReceiver
verarbeitet wird.
@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);
}
});
}
Wenn das Abo nicht mehr erforderlich ist, sollte Ihre App durch Aufrufen von Nearby.getMessagesClient(Activity).unsubscribe(PendingIntent)
beendet werden.
Beacon-Nachrichten parsen
Beacon-Anhänge sind Blobs mit beliebigen Daten, die Sie zu Beacons hinzufügen können. Jeder Anhang besteht aus folgenden Teilen:
- Namespace: eine Namespace-ID
- Typ: Der Datentyp.
- Daten: Der Datenwert für den Anhang.
Das folgende Code-Snippet zeigt, wie ein Nachrichten-Listener zum Parsen von Nachrichten verwendet wird, die von einem BLE-Beacon empfangen wurden:
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());
}
...
};
Das Parsen des Inhalts hängt vom Format der Byte ab. In diesem Beispiel wird davon ausgegangen, dass die Inhaltsbyte einen UTF-8-String codieren. Die Beacon-Nachricht kann jedoch andere Byteformate codieren, z. B. einen serialisierten Protokollpuffer. Weitere Informationen finden Sie unter Anhänge zu Beacons hinzufügen.
Rufen Sie namespaces.list auf, um herauszufinden, welche Namespaces Ihrem Projekt zugeordnet sind.
Hinweise:
-
Rufe
Nearby.getMessagesClient(Activity).unsubscribe()
in der FunktiononStop()
deiner Aktivität auf, um die Akkulaufzeit zu verlängern. Beachte, dass dies nur bei Abos im Vordergrund gilt. -
Verwenden Sie zum Reduzieren der Latenz die Option
Strategy.BLE_ONLY
beim Aufrufen vonNearby.getMessagesClient(Activity).subscribe()
. Wenn diese Option festgelegt ist, löst die Nearby Messages API keine klassischen Bluetooth-Scans aus. Dies verbessert die Latenz bei der Beacon-Erkennung, da das System nicht alle möglichen Scantypen durchläuft. - Verwenden Sie die Proximity Beacon API, um eine Nachrichtennutzlast an ein Beacon anzuhängen.