Twoja aplikacja może subskrybować załączniki obrazów typu beacon Bluetooth Low Energy (BLE), korzystając z tego samego mechanizmu, który jest stosowany do subskrybowania wiadomości publikowanych przez inne urządzenia w pobliżu. Po zasubskrybowaniu Twoja aplikacja będzie automatycznie otrzymywać wiadomości z beaconów i urządzeń w pobliżu.
Subskrybowanie komunikatów BLE beacon
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 projektem, wywołaj namespaces.list.
Uwagi:
-
Aby wydłużyć czas pracy na baterii, wywołaj
Nearby.getMessagesClient(Activity).unsubscribe()
w funkcjionStop()
aktywności. Pamiętaj, że ma to zastosowanie tylko w przypadku subskrybowania na pierwszym planie. -
Aby skrócić czas oczekiwania, podczas wywoływania
Nearby.getMessagesClient(Activity).subscribe()
użyj opcjiStrategy.BLE_ONLY
. Gdy ta opcja jest ustawiona, interfejs Near Messages API nie aktywuje klasycznego skanowania Bluetooth. Skraca to czas oczekiwania na wykrywanie beaconu, ponieważ system nie przełącza się przez wszystkie możliwe typy skanowania. - Aby dołączyć ładunek wiadomości do beaconu, użyj interfejsu Proximity Beacon API.