2014-09-10 3 views
5

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.So erhalten Sie Beacons von der RegionBootstrap AltBeacon-Methode

Es erkennt, wenn ein Beacon auch im Hintergrund in Reichweite ist.

Das Problem ist, ich muss wissen, welche Beacon ist es (UUID, Major, Minor), um es dann mit meiner lokalen Datenbank übereinstimmen und eine Benachrichtigung mit der App noch im Hintergrund zu werfen.

Die didEnterRegion (Region Region) Funktion hat nur eine matchesBeacon Methode, und ich habe versucht, die von den Baken Sie folgendermaßen vorgehen zu identifizieren gesehen wird, aber es wird eine Nullpointer werfen:

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<Beacon> beacons, Region region) { 
    if (beacons.size() > 0) { 
     Iterator<Beacon> beaconIterator = beacons.iterator(); 
     while (beaconIterator.hasNext()) { 
      Beacon beacon = beaconIterator.next(); 
      //check if beacon exists in our DB and throw notification 
     } 
    } 
} 

Bin ich fehlt etwas offensichtlich oder ist das nicht möglich mit dieser Bibliothek?

EDIT:

ich den Codebeispiel aktualisiert haben euch eine breitere Idee zu geben, und ich habe versucht, ohne Erfolg den Vorschlag FOliveira Umsetzung.

EDIT2:

Aktualisiert Code der davidgyoung Vorschlag zu reflektieren. Immer noch kein Glück. Ich habe ein Log.d() rechts 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 und das Ergebnis ist das gleiche.

Habe ich den Vorschlag falsch umgesetzt oder gibt es einen anderen Weg, um das zu erreichen?

+0

Wissen Sie, dass didEnterRegion aufgerufen wird? Versuchen Sie, oben eine Debug-Zeile hinzuzufügen. Offensichtlich, wenn es nicht aufgerufen wird, werden Sie nicht in der Lage sein, erfolgreich mit diesem Setup zu beginnen. – davidgyoung

+0

haben Sie dieses Problem gelöst? Ich stehe vor dem gleichen Problem. –

Antwort

0

können Sie RangeNotifier Schnittstelle implementieren und Sie können auf alle Beacon-Informationen zugreifen, die in der public void didRangeBeaconsInRegion(Collection<Beacon> Beacons, Region region)-Methode dieser Schnittstelle erfasst werden. Hoffe, ich habe die Frage richtig

+0

Ich habe RangeNotifier in der Hauptklasse implementiert, wird aber nicht vom RegionBootstrap im Hintergrund aufgerufen. –

+0

Ich habe meine Antwort aktualisiert, um Ihren Vorschlag zu reflektieren, weil es nicht funktioniert hat.Lass mich wissen, ob du etwas anderes meintest, weil es noch nicht funktioniert. –

+0

Oh ok, ich verstehe jetzt dein Problem! Ich denke, Sie können die Informationen nicht wirklich vom 'RegionBootstrap' erhalten, stattdessen können Sie versuchen, Regionen zu erstellen, die Ihren speziellen Beacons entsprechen. 'Region region = new Region' (" NameOfTheBeacon "," UUID "," Major "," Minor ")); 'das wird nur auf deinen spezifischen Regionen (die du definieren kannst, so weit ich weiß) auslösen. Dies ist nur ein Hinweis, da ich in meinen Anwendungen einen Dienst habe, der im Hintergrund läuft, der 'RangeNotifier' implementiert und alle verfügbaren Beacons überprüft. – FOliveira

4

Wenn Sie möchten, dass die App selbst auf Beacon Erkennung startet, dann ist die RegionBootstrap der einfachste Weg zu gehen. Um dies zu kombinieren mit Ranging benötigte einzelne Baken zu erfassen, dann fügen Sie Code in Ihrer didEnterRegion Methode wie folgt:

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

dann einen reichen Rückruf implementieren wie Sie haben.

Sie müssen auch den Code zu entfernen, was wahrscheinlich ist, was Ihr NullPointerException verursacht, weil das:

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)) { 
     //get info from DB and throw notification 
    } 
} 

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

+0

Ich habe versucht, Ihren Vorschlag jetzt in der ursprünglichen Frage zu implementieren. Meine didRangeBeaconsInRegion() wird nie aufgerufen. Habe ich etwas falsch gemacht oder fehle ich etwas? –

+0

Ich sehe nichts anderes mit Ihrem Code falsch, und ich habe festgestellt, dass dies in unserer Referenz-App funktioniert. Ich werde morgen eine aktualisierte Kopie unserer Referenz-App veröffentlichen und einen Kommentar hinzufügen, der Sie verlinkt, damit Sie es ausprobieren können. – davidgyoung

+0

Ich habe es bereits richtig funktioniert :) Danke für Ihre Unterstützung –

Verwandte Themen