iBeacon Ranging Service Not Returning any Beacons (Part 2)

倾然丶 夕夏残阳落幕 提交于 2019-12-12 06:35:57

问题


My code has now reached checkpoint 1 and 2. However, it is only detecting the beacon once. I want it to keep receiving the location of the beacon (distance) every five seconds. How can I implement this? Thanks again

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 it continue running until it is stopped.
        Log.d("Service", "Started");
        beaconManager.bind(this);
        beaconManager.getBeaconParsers().clear();
        beaconManager.getBeaconParsers().add(new BeaconParser().
                setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25"));


        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(5285);
                        handler.sendEmptyMessage(0);

                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                }

            }
        }).start();




        //return START_STICKY;
    }

public void startJob() {
    Log.d("Checkpoint", "Starting job for realzies");

    //onBeaconServiceConnect();
}


    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d("Service", "Ended");
        beaconManager.unbind(this);

    }

@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 a = "The first beacon " + firstBeacon.toString() + " is about " + 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) {   }
}

}


回答1:


I recommend you remove the Handler and the Thread as they seem unnecessary here.

I think all you need do is remove the Handler and the Thread, and run beaconManager.setForegroundScanPeriod as follows. Additionally, as best active you should probably bind the BeaconManager after setting all of its properties.

beaconManager.getBeaconParsers().clear();
beaconManager.getBeaconParsers().add(new BeaconParser().
            setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25"));
beaconManager.setForegroundScanPeriod(5285);
beaconManager.bind(this);


来源:https://stackoverflow.com/questions/35702632/ibeacon-ranging-service-not-returning-any-beacons-part-2

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!