2

我正在尝试使用我的设备检测信标设备,因此监视它们并收听范围通知。

我正在使用这个库和库参考应用程序。我设法使用设置信标布局方法收听自定义信标。

步骤1。我在应用程序类第 2 步中设置了布局。我将 baseactivity 实现了 beaconconsume,它在其中执行测距。

启动范围监控服务/方法时,我们使用“myRangeUniqueId”,但我认为 didexit 和 didenter 方法使用“backgroundId”。为什么呢?

所以情况是这样的,我将信标设备移动了几米远,我仍然看到一个信标通知,但我没有看到一个信标。即使信标很远,这些消息也会交替变化。

我必须做些什么来防止这种情况发生吗?请帮忙。

代码片段包括以下:

  1. 应用类实现BootstrapNotifier,代码如下

    BeaconManager beaconManager = org.altbeacon.beacon.BeaconManager.getInstanceForApplication(this);
    beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("LAYOUT_HERE"));
    
    Region region = new Region("backgroundRegion",
            null, null, null);
    regionBootstrap = new RegionBootstrap(this, region);
    
    // simply constructing this class and holding a reference to it in your custom Application
    // class will automatically cause the BeaconLibrary to save battery whenever the application
    // is not visible.  This reduces bluetooth power usage by about 60%
    backgroundPowerSaver = new BackgroundPowerSaver(this);
    
    
    
     @Override
     public void didEnterRegion(Region arg0) {
          // In this example, this class sends a notification to the user whenever a Beacon
         // matching a Region (defined above) are first seen.
        Log.d(TAG, "did enter region.");
        if (!haveDetectedBeaconsSinceBoot) {
            Log.d(TAG, "auto launching MainActivity");
            haveDetectedBeaconsSinceBoot = true;
        } else {
            // i am not sending out any notification here since there could be multiple beacons and i need to identify any one of them with a specific uuid
        }
    
    
    }
    
    
    @Override
    public void didExitRegion(Region region) {
        sendNotification("exited",2);
    }
    

我在didDetermineStateForRegion方法上什么都不做,它只是被覆盖了

  1. 我有一个BaseActivity实现BeaconConsumer

        private BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this);
       @Override
       protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            beaconManager.bind(this);
       }
    
        @Override 
        protected void onDestroy() {
            super.onDestroy();
            beaconManager.unbind(this);
         }
        @Override 
        protected void onPause() {
             super.onPause();
                  if(beaconManager.isBound(this))beaconManager.setBackgroundMode(true);
             }
     @Override 
     protected void onResume() {
         super.onResume();
         if (beaconManager.isBound(this)) beaconManager.setBackgroundMode(false);
      }
    
       @Override
       public void onBeaconServiceConnect() {
          beaconManager.setRangeNotifier(new RangeNotifier() {
             @Override 
             public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
                if (beacons.size() > 0) {
                /*EditText editText = (EditText)RangingActivity.this
                        .findViewById(R.id.rangingText);
                Beacon firstBeacon = beacons.iterator().next();
                logToDisplay("The first beacon "+firstBeacon.toString()+" is about "+firstBeacon.getDistance()+" meters away.");    */
        CommonUtilities.sendNotification(BaseActivity.this,"entered",1);
                        }
                    }
                }
            }
        }
    });
    
    try {
        beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId",null, null, null));
        } catch (RemoteException e) {   }
      }
    

PS:当我将设备移动到大约 5 米外的另一个位置时,我会收到随机通知,表明信标在范围内,然后我立即收到信标超出范围的通知。

谢谢

4

1 回答 1

1

几点:

  1. 唯一标识符用作标识 a 的密钥,Region以便您可以开始和停止测距和监视。您在系统中构建和注册的每个区域都应该有一个不同的字符串标识符,但该值可以是您不知道的任何值,只要它是唯一的即可。

  2. 回调每秒进行一次,而didRangeBeaconsInRegion不仅仅是在移动设备进入信标范围时。

  3. 如果didExitRegion信标在 20 米左右时收到重复的回调,则可能是信标传输频率不够高。了解信标的品牌、型号和传输频率以及您的移动设备型号可能有助于解决这个问题。

于 2015-03-12T11:25:29.623 回答