2014-09-10 15 views
5

Sto utilizzando il codice di esempio in questa pagina (http://altbeacon.github.io/android-beacon-library/samples.html) nell'Avvio di un'app nella sezione Sfondo e ho un'app funzionante.Come ottenere i beacon visibili dalla RegioneBootstrap Metodo AltBeacon

Rileva ogni volta che un raggio è nel raggio di azione anche sullo sfondo.

Il problema è che ho bisogno di sapere quale beacon è (UUID, Major, Minor) per poi abbinarlo al mio database locale e lanciare una notifica con l'app ancora sullo sfondo.

La didEnterRegion (regione Regione) la funzione ha solo un metodo matchesBeacon, e ho provato a fare quanto segue per identificare quale dei fari viene visto ma sta gettando un 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<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 
     } 
    } 
} 

mi manca qualcosa di ovvio o non è possibile con questa libreria?

EDIT:

Ho aggiornato il codice di esempio per dare voi ragazzi un'idea più ampia e ho provato l'attuazione del suggerimento di FOliveira senza alcun successo.

EDIT2:

codice aggiornato per riflettere il suggerimento del davidgyoung. Ancora senza fortuna. Ho un Log.d() proprio sulla prima riga della funzione didRangeBeaconsInRegion() e non viene chiamato.

Ho provato ad aggiungere BeaconManager.getInstanceForApplication (this) .setRangeNotifier (this); prima del blocco try/catch e il risultato è lo stesso.

Ho implementato il suggerimento errato o esiste un altro modo per farlo funzionare?

+0

Sapete che è stato chiamato didEnterRegion? Prova ad aggiungere una linea di debug nella parte superiore. Ovviamente se non viene chiamato, non sarai in grado di iniziare con successo andando con questa configurazione. – davidgyoung

+0

hai risolto questo problema? Sto affrontando lo stesso problema. –

risposta

0

è possibile implementare l'interfaccia RangeNotifier ed è possibile accedere a tutte le informazioni sul beacon acquisite nel metodo public void didRangeBeaconsInRegion(Collection<Beacon> Beacons, Region region) di tale interfaccia. Spero di avere la domanda giusta

+0

Ho implementato RangeNotifier nella classe principale ma non viene chiamato da RegionBootstrap sullo sfondo. –

+0

Ho aggiornato la mia risposta per riflettere il tuo suggerimento, perché non ha funzionato.Fammi sapere se intendevi una cosa diversa perché non funziona ancora. –

+0

Oh ok, ora capisco il tuo problema! Penso che tu non sia in grado di ottenere le informazioni dal 'RegionBootstrap', invece, puoi provare a creare regioni corrispondenti ai tuoi beacon specifici' Region region = new Region ("NameOfTheBeacon", "UUID", "Major", "Minor"); che si attiverà solo sulle tue regioni specifiche (che puoi definire diverse per quanto ne so). Questo è solo un suggerimento perché nelle mie applicazioni ho un servizio che viene eseguito in background che implementa 'RangeNotifier' e controllo tutti i beacon disponibili. – FOliveira

4

Se vuoi che l'app si avvii sul rilevamento dei beacon, allora il RegionBootstrap è la via più facile da percorrere. Al fine di combinare questo con Ranging necessario per rilevare i singoli fari, quindi aggiungere il codice nel metodo didEnterRegion in questo modo:

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

quindi implementare una funzione di callback che vanno come si deve.

È inoltre necessario rimuovere il codice qui sotto, che è probabilmente ciò che sta causando il vostro NullPointerException, perché il:

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: Ho aggiornato l'applicazione di riferimento della biblioteca per mostrare come questo può essere fatto con successo. Vedi qui: https://github.com/AltBeacon/android-beacon-library-reference/blob/master/src/org/altbeacon/beaconreference/BeaconReferenceApplication.java

+0

Ho provato a implementare il tuo suggerimento come riportato nella domanda originale ora. My didRangeBeaconsInRegion() non viene mai chiamato. Ho fatto qualcosa di sbagliato o mi manca qualcosa? –

+0

Non vedo altro nel codice, e ho verificato che funzioni nella nostra app di riferimento. Pubblicherò una copia aggiornata della nostra app di riferimento domani e aggiungerò un commento che ti consentirà di provare. – davidgyoung

+0

Ho già funzionato correttamente :) grazie per il supporto –

Problemi correlati