Ihre App kann Beacon-Anhänge von Bluetooth Low Energy (BLE) mit demselben Mechanismus abonnieren, mit dem Nachrichten von anderen Geräten in der Nähe abonniert werden. Wenn Sie ein Abo abschließen, erhält Ihre App automatisch Nachrichten sowohl von Beacons als auch von Geräten in der Nähe.
BLE-Beacon-Nachrichten abonnieren
Es gibt zwei Möglichkeiten, wie Ihre App BLE-Beacon-Nachrichten abonnieren kann:
- Im Vordergrund als Reaktion auf eine Nutzeraktion oder einem Ereignis.
- Im Hintergrund, wenn deine App nicht ausgeführt wird.
Im Vordergrund abonnieren
Wenn Ihre App Beacon-Nachrichten im Vordergrund abonniert, werden Scans bis die App das Abo beendet. Nur Vordergrund starten , wenn Ihre App aktiv ist. Dies geschieht in der Regel als Reaktion auf eine Nutzeraktion.
Deine App kann ein Abo im Vordergrund initiieren, indem sie Folgendes aufruft:
Nearby.getMessagesClient(Activity).subscribe(MessageListener, SubscribeOptions)
und Festlegen der Option Strategy
auf BLE_ONLY
.
Das folgende Code-Snippet zeigt, wie ein Abo im Vordergrund initiiert 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 keine Benachrichtigungen mehr erhalten
durch einen Anruf
Nearby.getMessagesClient(Activity).unsubscribe(MessageListener)
Inhalte im Hintergrund abonnieren
Wenn Ihre App im Hintergrund Beacon-Nachrichten abonniert, werden Scans mit geringem Energieverbrauch werden bei Bildschirm-on-Ereignissen ausgelöst, auch wenn Ihre App derzeit nicht aktiv ist. Du kannst diese Scan-Benachrichtigungen zum „Aufwachen“ verwenden Ihre App als Reaktion auf eine Nachricht zu senden. Abos im Hintergrund verbrauchen weniger Strom als Abos im Vordergrund, haben aber eine höhere Latenz und eine geringere Zuverlässigkeit.
Deine App kann ein Hintergrundabo initiieren, indem sie Folgendes aufruft:
Nearby.getMessagesClient(Activity).subscribe(PendingIntent, SubscribeOptions)
und Festlegen der Option Strategy
auf BLE_ONLY
.
Das folgende Code-Snippet zeigt das Initiieren eines Hintergrundabos durch
Anrufen
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);
}
Das folgende Code-Snippet zeigt, wie der Intent in der
Klasse 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);
}
});
}
Wenn das Abo nicht mehr erforderlich ist, sollte Ihre App keine Benachrichtigungen mehr erhalten
durch einen Anruf
Nearby.getMessagesClient(Activity).unsubscribe(PendingIntent)
Beacon-Nachrichten parsen
Beacon-Anhänge sind Blobs mit beliebigen Daten, die Sie Beacons hinzufügen können. Jeder Anhang besteht aus den folgenden Teilen:
- Namespace: Eine Namespace-ID.
- Type: Der Datentyp.
- Daten: Der Datenwert für den Anhang.
Im folgenden Code-Snippet wird die Verwendung eines Nachrichten-Listeners zum Parsen dargestellt. von einem BLE-Beacon empfangene Nachrichten:
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 Bytes ab. In diesem Beispiel wird vorausgesetzt, dass die Contentbytes einen UTF-8-String codieren. Ihre Beacon-Nachricht kann jedoch andere Byteformate zu codieren (z. B. einen serialisierten Protokollpuffer). Weitere Informationen finden Sie unter Anhänge zu Beacons hinzufügen.
Wenn Sie wissen möchten, welche Namespaces mit Ihrem Projekt verknüpft sind, rufen Sie namespaces.list auf.
Hinweise:
-
Um die Akkulaufzeit zu verlängern, rufe in der
onStop()
-Funktion deiner AktivitätNearby.getMessagesClient(Activity).unsubscribe()
auf. Hinweis: Das gilt nur, wenn du im Vordergrund abonnierst. -
Um die Latenz zu reduzieren, verwenden Sie die Option
Strategy.BLE_ONLY
, wenn SieNearby.getMessagesClient(Activity).subscribe()
aufrufen. Wenn diese Option festgelegt ist, löst die Nearby Messages API keine klassischen Bluetooth-Scans aus. Dadurch wird die Latenz bei der Beacon-Erkennung verbessert, da das System nicht alle möglichen Scantypen durchläuft. - Wenn Sie einer Beacon-Nachricht eine Nachrichtenn-Nutzlast anhängen möchten, verwenden Sie die Proximity Beacon API.