iBeacon 测距服务不返回任何信标(第 2 部分)

iBeacon Ranging Service Not Returning any Beacons (Part 2)

我的代码现在已经到达检查点 1 和 2。但是,它只检测到一次信标。我希望它每五秒接收一次信标的位置(距离)。我该如何实施?再次感谢

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) {   }
}

}

我建议您删除 Handler 和 Thread,因为它们在这里似乎是不必要的。

我认为您需要做的就是移除 Handler 和 Thread,然后 运行 beaconManager.setForegroundScanPeriod 如下。此外,作为最佳活动,您应该在设置所有属性后绑定 BeaconManager。

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