2017-09-16 6 views
0

J'utilise la bibliothèque AltBeacon pour détecter un périphérique iBeacon. Voici le code que j'utilise, en fonction de la documentation du AltBeacon, mais la balise n'est pas détecté:Détecter iBeacon avec la bibliothèque AltBeacon sur Android

beaconManager = BeaconManager.getInstanceForApplication(this); 
beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24")); 
beaconManager.bind(this); 
beaconManager.addMonitorNotifier(new MonitorNotifier() { 
     @Override 
     public void didEnterRegion(Region region) { 
      Log.i("test", "I just saw an beacon for the first time!"); 
     } 

     @Override 
     public void didExitRegion(Region region) { 
      Log.i("test", "I no longer see an beacon"); 
     } 

     @Override 
     public void didDetermineStateForRegion(int state, Region region) { 
      Log.i("test", "I have just switched from seeing/not seeing beacons: "+state); 
     } 
    }); 

try { 
    beaconManager.startMonitoringBeaconsInRegion(new Region("e2c56db5-dffb-48d2-b060-d0f5a71096e0", null, null, null)); 
} catch (RemoteException e) { } 

Est-ce mauvais code?

Répondre

0

Deux questions:

Numéro 1:

Lorsque vous appelez beaconManager.bind(this); la classe englobante doit être une instance de BeaconConsumer (et en général une instance de Application ou Activity autrement vous devez enchaîner les méthodes BeaconConsumer.)

Le point clé est que vous ne pouvez appeler ce bloc:

try { beaconManager.startMonitoringBeaconsInRegion(new Region("e2c56db5-dffb-48d2-b060-d0f5a71096e0", null, null, null)); } catch (RemoteException e) { }

après avoir reçu un rappel à onBeaconServicecConnected. Ce code devrait normalement être dans ce rappel. Parce que le bloc d'exception est vide et ne consigne rien, je suspecte que le code lève cette exception et échoue silencieusement. Vous devriez toujours au moins enregistrer une erreur dans un bloc d'exception pour aider à trouver des problèmes comme celui-ci.

Numéro 2:

Le constructeur de la région devrait ressembler à ceci:

new Region("com.mydomain.myapp.region1", Identifier.parse("e2c56db5-dffb-48d2-b060-d0f5a71096e0"), null, null);

Notez que le premier paramètre est une chaîne qui sert d'identifiant unique pour la région afin que vous puissiez plus tard utiliser le même identifiant pour arrêter ou remplacer la région surveillée. Le deuxième paramètre est le ProximityUUID et les troisième et quatrième paramètres sont respectivement le majeur et le mineur.

La façon dont l'identificateur est construit dans le code affiché devrait fonctionner car il définit un identifiant unique de "e2c56db5-dffb-48d2-b060-d0f5a71096e0" avec des valeurs ProximityUUID/major/minor qui sont toutes nulles et donc génériques. Il est cependant trompeur, car il suggère qu'il cherche un ProximityUUID spécifique alors que ce n'est pas le cas.

+0

Mon activité implémente BeaconConsumer infacter le code compiler sans problèmes. Maintenant j'ai modifié le code comme ceci: 'beaconManager.startMonitoringBeaconsInRegion (nouvelle région (" com.example.app.region1 ", Identifier.parse (" e2c56db5-dffb-48d2-b060-d0f5a71096e0 "), null, null)); ' Mais ne fonctionne toujours pas. J'ai aussi ajouté un journal dans ce bloc try/catch et le code n'a pas échoué. Toute solution? – Loris

+0

De plus, lorsque je lance l'application pour la première fois, l'événement 'didDetermineStateForRegion' est déclenché avec le paramètre state à 0 – Loris

+0

Est-ce que vous recevez un rappel sur onBeaconServiceConnected? – davidgyoung