6 Stimmen

Wie man sichtbare Beacons aus der RegionBootstrap AltBeacon Methode erhält

Ich verwende den Beispielcode auf dieser Seite (http://altbeacon.github.io/android-beacon-library/samples.html) im Abschnitt "Starten einer App im Hintergrund" und ich habe eine funktionierende App.

Es erkennt immer, wenn ein Beacon im Bereich ist, auch im Hintergrund.

Das Problem ist, ich muss wissen, um welchen Beacon es sich handelt (UUID, Major, Minor), um es dann mit meiner lokalen Datenbank abzugleichen und unter der App im Hintergrund eine Benachrichtigung auszulösen.

Die Funktion didEnterRegion(Region region) hat nur eine matchesBeacon-Methode, und ich habe versucht, Folgendes zu tun, um zu identifizieren, welcher der Beacons gesehen wird, aber es wirft eine NullPointerException:

public class SightSeeing extends Activity implements BootstrapNotifier, RangeNotifier {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Region region = new Region("sightRegion", null, null, null);
    regionBootstrap = new RegionBootstrap(this, region);

    BeaconManager.getInstanceForApplication(this).getBeaconParsers().add(
            new BeaconParser(). setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24")
    );

    BeaconManager.getInstanceForApplication(this).setRangeNotifier(this);

}

@Override
public void didEnterRegion(Region region) {

    regionBootstrap.disable();

    BeaconManager.getInstanceForApplication(this).setRangeNotifier(this);

    try {
        BeaconManager.getInstanceForApplication(this).startRangingBeaconsInRegion(region);
    }
    catch (RemoteException e) {
        Log.e(TAG, "Can't start ranging");
    }

 }

@Override
public void didRangeBeaconsInRegion(Collection beacons, Region region) {
    if (beacons.size() > 0) {
        Iterator beaconIterator = beacons.iterator();
        while (beaconIterator.hasNext()) {
            Beacon beacon = beaconIterator.next();
            //check if beacon exists in our DB and throw notification
        }
    }
}

Fehlt mir etwas Offensichtliches oder ist das mit dieser Bibliothek nicht möglich?

EDIT:

Ich habe das Codebeispiel aktualisiert, um euch eine umfassendere Vorstellung zu geben, und ich habe versucht, den Vorschlag von FOliveira umzusetzen, jedoch ohne Erfolg.

EDIT2:

Code wurde aktualisiert, um den Vorschlag von davidgyoung umzusetzen. Trotzdem kein Glück. Ich habe ein Log.d() direkt in der ersten Zeile der Funktion didRangeBeaconsInRegion() und es wird nicht aufgerufen.

Ich habe versucht, BeaconManager.getInstanceForApplication(this).setRangeNotifier(this); vor dem try/catch-Block hinzuzufügen und das Ergebnis ist dasselbe.

Habe ich den Vorschlag falsch umgesetzt oder gibt es eine andere Möglichkeit, dies zum Laufen zu bringen?

4voto

davidgyoung Punkte 61290

Wenn Sie möchten, dass die App selbst beim Erkennen eines Beacons startet, dann ist der RegionBootstrap der einfachste Weg. Um dies mit der Ortung zu kombinieren, die erforderlich ist, um einzelne Beacons zu erkennen, fügen Sie Code in Ihrer didEnterRegion-Methode wie folgt hinzu:

try {
    BeaconManager.getInstanceForApplication(this).startRangingBeaconsInRegion(region);
} 
catch (RemoteException e) { 
    Log.e(TAG, "Kann Ortung nicht starten");
}

Implementieren Sie dann einen Ortungs-Callback wie zuvor.

Sie müssen auch den folgenden Code entfernen, der wahrscheinlich Ihre NullPointerException verursacht, weil er Folgendes ist:

for(int i=0; i< beaconsList.size(); i++) {
    Beacon b = new Beacon.Builder()
            .setId1(beaconsList.get(i).get("uuid"))
            .setId2(beaconsList.get(i).get("major"))
            .setId3(beaconsList.get(i).get("minor"))
            .build();

    if(region.matchesBeacon(b)) {
        // Informationen aus der Datenbank abrufen und Benachrichtigung senden
    }
 }

BEARBEITEN: Ich habe die Referenzanwendung der Bibliothek aktualisiert, um zu zeigen, wie dies erfolgreich durchgeführt werden kann. Siehe hier: https://github.com/AltBeacon/android-beacon-library-reference/blob/master/src/org/altbeacon/beaconreference/BeaconReferenceApplication.java

0voto

FOliveira Punkte 558

Sie können das RangeNotifier-Interface implementieren und alle Beacon-Informationen abrufen, die im public void didRangeBeaconsInRegion(Collection Beacons, Region region)-Methoden dieses Interfaces erfasst wurden. Hoffe, ich habe die Frage richtig verstanden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X