-->

iBeacon Ranging Service Not Returning any Beacons

2019-09-13 02:49发布

问题:

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);