Twoja aplikacja może subskrybować przyłącza beaconów Bluetooth Low Energy (BLE) przy użyciu tego samego mechanizmu, który służy do subskrybowania wiadomości publikowanych przez inne urządzenia w pobliżu. Gdy włączysz tę opcję, aplikacja będzie automatycznie otrzymywać wiadomości zarówno z beaconów, jak i urządzeń w pobliżu.
Subskrybuj wiadomości beacon z BLE
Aplikacja może zasubskrybować wiadomości typu beacon BLE na dwa sposoby:
- Na pierwszym planie w odpowiedzi na działanie lub zdarzenie użytkownika.
- W tle, gdy aplikacja nie jest uruchomiona.
Subskrybuj na pierwszym planie
Gdy aplikacja subskrybuje wiadomości typu beacon na pierwszym planie, skanowanie jest wykonywane w sposób ciągły, dopóki nie anulujesz subskrypcji. Rozpoczynaj subskrypcję na pierwszym planie tylko wtedy, gdy aplikacja jest aktywna – zwykle w odpowiedzi na działanie użytkownika.
Aplikacja może rozpocząć subskrypcję na pierwszym planie, wywołując opcję Nearby.getMessagesClient(Activity).subscribe(MessageListener, SubscribeOptions)
i ustawiając opcję Strategy
na BLE_ONLY
.
Ten fragment kodu inicjuje subskrypcję na pierwszym planie 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);
}
Gdy subskrypcja nie będzie już wymagana, anuluj subskrypcję aplikacji, dzwoniąc pod numer Nearby.getMessagesClient(Activity).unsubscribe(MessageListener)
.
Subskrybuj w tle
Gdy w aplikacji masz włączone powiadomienia w tle o obrazach typu beacon, skany o małej mocy są uruchamiane po wywołaniu ekranu, nawet jeśli aplikacja jest obecnie nieaktywna. Powiadomienia te umożliwiają wybudzanie aplikacji w odpowiedzi na konkretną wiadomość. Subskrypcje w tle zużywają mniej energii niż subskrypcje na pierwszym planie, ale mają dłuższy czas oczekiwania i niższą niezawodność.
Aplikacja może rozpocząć subskrypcję w tle, wywołując metodę Nearby.getMessagesClient(Activity).subscribe(PendingIntent, SubscribeOptions)
i ustawiając opcję Strategy
na BLE_ONLY
.
Poniższy fragment kodu inicjuje subskrypcję w tle przez wywołanie metody 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);
}
Fragment kodu poniżej pokazuje, jak działają intencje w klasie 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);
}
});
}
Gdy subskrypcja nie będzie już wymagana, anuluj subskrypcję aplikacji, dzwoniąc pod numer Nearby.getMessagesClient(Activity).unsubscribe(PendingIntent)
.
Analizuj wiadomości typu beacon
Załączniki beacon to obiekty arbitralne dowolnych danych, które możesz dodawać do obrazów typu beacon. Każdy załącznik składa się z następujących elementów:
- Przestrzeń nazw: identyfikator przestrzeni nazw.
- Typ: typ danych.
- Dane: wartość danych załącznika.
Ten fragment kodu pokazuje, jak detektor wiadomości odbieranych z obrazu typu 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());
}
...
};
Analizowanie treści zależy od formatu bajtów. W tym przykładzie założono, że bajty treści kodują ciąg znaków UTF-8, ale wiadomość typu beacon może kodować inne formaty bajtów (na przykład zserializowany bufor protokołu). Więcej informacji znajdziesz w artykule Dodawanie załączników do obrazów typu beacon.
Aby dowiedzieć się, które przestrzenie nazw są powiązane z Twoim projektem, wywołaj plik namespaces.list.
Uwagi:
-
Aby oszczędzać baterię, wywołaj funkcję
Nearby.getMessagesClient(Activity).unsubscribe()
w funkcjionStop()
aktywności. Pamiętaj, że dotyczy to tylko subskrypcji pochodzących z pierwszego planu. -
Aby skrócić czas oczekiwania, użyj opcji
Strategy.BLE_ONLY
podczas nawiązywania połączenia zNearby.getMessagesClient(Activity).subscribe()
. Gdy ustawisz tę opcję, interfejs Nearby Messages API nie uruchomi klasycznych skanowania Bluetooth. Powoduje to zmniejszenie opóźnienia wykrywania beaconów, ponieważ system nie przecina wszystkich dostępnych typów skanowania. - Aby dołączyć ładunek wiadomości do obrazu typu beacon, skorzystaj z interfejsu Proximity Beacon API.