【问题标题】:AltBeacon -Null value in didenterRegion() and didexitRegion() methodAltBeacon -didenterRegion() 和 didexitRegion() 方法中的 Null 值
【发布时间】:2015-06-23 05:07:51
【问题描述】:

我的代码片段: 我已经尝试过 altbeacon gradle。 我已经按照下面的代码声明了 Region。

我在 Application 类的 onCreate 方法中写了这一行。 Region region = new Region("所有信标", null, null, null);

我可以在“didRangeBeaconsInRegion”中获取Beacon的major、minor和uuid。

问题:我没有将 didEnterRegion() 和 didExitRegion() 方法中的信标识别为获取主要、次要和 uuid 的空值。

我该如何解决这个问题?

【问题讨论】:

    标签: android bluetooth-lowenergy altbeacon


    【解决方案1】:

    没有错,这就是信标监控的工作原理。当您进行监控时,当检测到与您所在区域定义的通配符模式匹配的任何信标时,您会收到通知。此通知告诉您检测到匹配的信标,并提供对正在监视的 Region 对象的引用。

    在所示示例中,定义的区域对于三个信标标识符中的每一个都为空,这意味着它将匹配任何信标。因此,当检测到任何信标时,它只提供一个回调,并且不会告诉您匹配的标识符。

    您有两种访问标识符的选择:

    1. 如果您只关心几个信标,您可以监控多个显式区域,例如:Region region1 = new Region("first beacon", "2F234454-CF6D-4A0F- ADF2-F4911BA9FFA6", "1", " 2"); 这将在回调中为您提供一个包含所有标识符设置的 Region 对象。

    2. 使用测距 API,它每秒都会给您一个回调,其中包含所有信标的列表,其标识符与定义的区域匹配。

    下面是选项 1 的完整 Activity 实现。运行它时,您将在 LogCat 中看到以下内容:

    D/MonitoringActivity(31644): starting monitoring
    D/MonitoringActivity(31644): Entered region: null null null
    D/MonitoringActivity(31644): Entered region: 2f234454-cf6d-4a0f-adf2-f4911ba9ffa6 1 1
    

    请注意,第一个区域条目将发送所有空标识符,因为活动也在监视一个全空区域。

    public class MonitoringActivity extends Activity implements BeaconConsumer, MonitorNotifier {
        protected static final String TAG = "MonitoringActivity";
        private BeaconManager mBeaconManager;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_monitoring);
            mBeaconManager = BeaconManager.getInstanceForApplication(this);
            mBeaconManager.bind(this);
        }
    
        @Override
        public void onBeaconServiceConnect() {
            try {
                mBeaconManager.setMonitorNotifier(this);
                mBeaconManager.startMonitoringBeaconsInRegion(new Region("all beacons region", null, null, null));
                mBeaconManager.startMonitoringBeaconsInRegion(new Region("region 1", Identifier.parse("2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6"), Identifier.parse("1"), Identifier.parse("1")));
                mBeaconManager.startMonitoringBeaconsInRegion(new Region("region 2", Identifier.parse("2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6"), Identifier.parse("1"), Identifier.parse("2")));
                Log.d(TAG, "starting monitoring");
            } catch (RemoteException e) {
                Log.e(TAG, "can't monitor", e);
            }
        }
    
        @Override
        public void didEnterRegion(Region region) {
            Log.d(TAG, "Entered region: "+region.getId1()+" "+region.getId2()+" "+region.getId3());
        }
    
        @Override
        public void didExitRegion(Region region) {
            Log.d(TAG, "Exited region: "+region.getId1()+" "+region.getId2()+" "+region.getId3());
        }
    
        @Override
        public void didDetermineStateForRegion(int state, Region region) {
    
        }
    }
    

    【讨论】:

    • 第一种方法,你告诉它的硬编码或预定义的信标。我使用了测距 api 及其方法 didRangeBeaconsInRegion 方法。我在 didRangeBeaconsInRegion 方法中设置了标识符,但在 didEnterRegion 和 didExitRegion 方法中仍然得到空值。
    • 正如你所说,我们必须首先为我拥有的所有列表定义区域,然后我会得到该信息(uuid、major、minor)等,对吗?
    • 您能告诉我如何在 List 中添加价值吗?
    • 您能否展示您的代码并准确说明您在哪里意外获得了空标识符?
    • 抱歉,我真的需要查看更大的代码部分,包括回调。您能否将其添加到问题的底部?
    猜你喜欢
    • 1970-01-01
    • 2016-09-16
    • 1970-01-01
    • 2014-09-30
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多