没有错,这就是信标监控的工作原理。当您进行监控时,当检测到与您所在区域定义的通配符模式匹配的任何信标时,您会收到通知。此通知告诉您检测到匹配的信标,并提供对正在监视的 Region 对象的引用。
在所示示例中,定义的区域对于三个信标标识符中的每一个都为空,这意味着它将匹配任何信标。因此,当检测到任何信标时,它只提供一个回调,并且不会告诉您匹配的标识符。
您有两种访问标识符的选择:
如果您只关心几个信标,您可以监控多个显式区域,例如:Region region1 = new Region("first beacon", "2F234454-CF6D-4A0F- ADF2-F4911BA9FFA6", "1", " 2"); 这将在回调中为您提供一个包含所有标识符设置的 Region 对象。
使用测距 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) {
}
}