Otrzymywanie obrazów typu beacon

Aplikacja może subskrybować przyłącza beaconów Bluetooth Low Energy (BLE) za pomocą tego samego mechanizmu co w przypadku subskrypcji wiadomości publikowanych przez inne urządzenia w pobliżu. Gdy zasubskrybujesz aplikację, będzie ona automatycznie otrzymywać wiadomości z beaconów i urządzeń w pobliżu.

Subskrybowanie wiadomości z obrazu typu 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 Twoim projektem, wywołaj namespaces.list.

Uwagi: