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?