android - iBeacon Ranging Service Not Returning any Beacons -
i working ibeacon technology, , trying create rangingservice search nearby ibeacons every 5 seconds , run in background of application. code below not working. i'm sure i'm making dumb mistake somewhere, can see in log files checkpoint 3 , 4 being reached every 5 seconds, while checkpoints 1 , 2 never being reached. thus, nearby beacons not being detected. don't have experience services or beacons, appreciate help, @davidgyoung.
please forgive me if code below isn't indented :) can me.
import android.app.service; import android.content.intent; import android.os.handler; import android.os.ibinder; import android.os.message; import android.os.remoteexception; import android.util.log; import android.widget.edittext; import android.widget.toast; import org.altbeacon.beacon.beacon; import org.altbeacon.beacon.beaconconsumer; import org.altbeacon.beacon.beaconmanager; import org.altbeacon.beacon.rangenotifier; import org.altbeacon.beacon.region; import java.util.collection; public class rangingservice extends service implements beaconconsumer { private beaconmanager beaconmanager = beaconmanager.getinstanceforapplication(this); handler handler; string b = ""; @override public ibinder onbind(intent arg0) { return null; } @override public void onstart(intent intent, int startid) { // let continue running until stopped. log.d("service", "started"); handler = new handler(){ @override public void handlemessage(message msg) { // todo auto-generated method stub super.handlemessage(msg); log.d("checkpoint", "5 seconds have passed"); } }; new thread(new runnable(){ public void run() { // todo auto-generated method stub while(true) { try { startjob(); log.d("checkpoint", "job has started"); thread.sleep(5000); handler.sendemptymessage(0); } catch (interruptedexception e) { // todo auto-generated catch block e.printstacktrace(); } } } }).start(); //return start_sticky; } public void startjob() { beaconmanager.bind(this); log.d("the first beacon", "starting job realzies"); onbeaconserviceconnect(); } @override public void ondestroy() { super.ondestroy(); log.d("service", "ended"); } @override public void onbeaconserviceconnect() { log.d("checkpoint3", "checkpoint3"); beaconmanager.setrangenotifier(new rangenotifier() { @override public void didrangebeaconsinregion(collection<beacon> beacons, region region) { log.d("checkpoint1", "checkpoint1"); if (beacons.size() > 0) { log.d("checkpoint2", "checkpoint2"); //edittext edittext = (edittext)rangingactivity.this.findviewbyid(r.id.rangingtext); beacon firstbeacon = beacons.iterator().next(); string = "the first beacon " + firstbeacon.tostring() + " " + firstbeacon.getdistance() + " meters away. rssi = " + firstbeacon.getrssi(); log.d("service", a); //logtodisplay(a); } } }); try { beaconmanager.startrangingbeaconsinregion(new region("myranginguniqueid", null, null, null)); log.d("checkpoint4", "checkpoint4"); } catch (remoteexception e) { } } }// update code formatting
main activity:
public void didenterregion(region arg0) { // in example, class sends notification user whenever beacon // matching region (defined above) first seen. log.d(tag, "did enter region."); startservice(new intent(this, rangingservice.class)); }
a few tips:
don't call
onbeaconserviceconnect();
manually. callback method gets called android beacon library when beacon scanning service ready go result of callbeaconmanager.bind(this);
if call yourself, defeat purpose, , cause problems.you should not call
beaconmanager.bind(this);
every 5 seconds -- call once when service starts up. calling repeatedly cause problems.make sure android beacon library configured types of beacons using. default detect open source altbeacon packets. if using proprietary beacon type, need create
beaconparser
, add configure library. can google search "beaconparser" , proprietary beacon type proper line of code configure library.
Comments
Post a Comment