0

我的代码现在已经到达检查点1和2了。但是,它只检测一次信标。我希望它每五秒钟收到一次信标(距离)的位置。我怎样才能实现这个?再次感谢iBeacon测距服务不返回任何信标(第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) { } 
} 

}

+0

这并不明显,为什么它只扫描检测信标一次。您可以尝试添加调试行来记录所有空的catch块中的任何异常。您也可以尝试在BeaconManager解除绑定之前停止测距(尽管这不应该是绝对必要的)。还值得注意的是,这可能不是最简单的方法 - 图书馆已经开始自己的服务并且可以配置为发送测距结果约。每5秒只需设置beaconManager.setForegroundBetweenScanPeriod(4000l); beaconManager.setForegroundScanPeriod(1100l);' – davidgyoung

+0

感谢您的快速响应。我将如何使用setForegroundBetweenScanPeriod函数?我是否会从主要活动中调用它,然后摆脱我创建的服务? (对不起,如果这些是基本问题 - 我是一个业余程序员)再次感谢:) –

+0

在@ Chris_Wilson的回答下看到我的评论。他走在正确的轨道上。 – davidgyoung

回答

1

我建议你删除的处理程序和线程,因为他们似乎没有必要在这里。

我认为你所需要做的就是删除处理程序和线程,然后运行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); 
+0

感谢您的回复!我非常感谢帮助。我会在主Activity或服务类中包含这段代码吗? –

+0

这一切都取决于你想要做什么,但除非你有特定的理由使用你可能不想要的服务。如果您愿意,您可以在您的活动onCreate或onResume中绑定BeaconManager。 –

+1

我同意这是一个更好的方法。如果您只需要从单个活动访问信标扫描结果,只需将该代码放入该活动的onCreate方法即可。如果您需要在多个活动之间共享结果,则可以使用定制的Android应用程序类来执行测试,并将代码放入其onCreate方法中。 – davidgyoung