AltBeacon - 在设备中重新启动蓝牙后搜索信标
AltBeacon - Search for beacons after restarting bluetooth in device
我有一个 android 应用程序,我在其中检测 foreground/background 中的信标。一切正常,除非我关闭设备上的蓝牙。在这种情况下,它被称为 OnExitRegion,但我不得不忽略它,因为我真的不知道用户在做什么,但如果我远离信标并再次打开蓝牙,onExitRegion 将不会再次被调用,我不会知道我离开了这个区域。
这是我的代码的一部分。
public class MyApplication extends Application implements BootstrapNotifier {
public void onCreate() {
super.onCreate();
...
mBeaconManager = BeaconManager.getInstanceForApplication(this);
mBeaconManager.getBeaconParsers().add(new BeaconParser().
setBeaconLayout(Constants.BEACON_LAYOUT));
mBeaconRegion = new Region(Constants.BEACON_BACKGROUND_REGION, Identifier.parse(Constants.BEACON_UDID), null, null);
regionBootstrap = new RegionBootstrap(this, mBeaconRegion);
backgroundPowerSaver = new BackgroundPowerSaver(this);
mBeaconManager.setBackgroundScanPeriod(Constants.BEACON_BACKGROUND_SCAN_PERIOD);
mBeaconManager.setBackgroundBetweenScanPeriod(Constants.BEACON_BACKGROUND_BETWEEN_SCAN_PERIOD);
mBeaconManager.setAndroidLScanningDisabled(true);
...
}
我尝试创建一个 BroadcastReceiver 来检测蓝牙何时关闭或打开
public class BluetoothBroadcastReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) {
if (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1)
== BluetoothAdapter.STATE_OFF) {
Log.w("BLUETOOTH", "Bluetooth is disconnected");
} else {
Log.w("BLUETOOTH", "Bluetooth is connected");
}
}
}
}
我需要的是检查这个广播接收器,当蓝牙打开时,如果我还在这个区域或者不修改UI。
希望我的解释足够清楚。
非常感谢!
显然,如果蓝牙无线电关闭,Android Beacon Library 无法检测到您是否真的离开了信标区域。但是这里有一个想法,说明一旦蓝牙重新打开,您可以做什么来模拟退出行为:
保留两个应用程序级变量:
Set<Region> regionsActive = new HashSet<Region>();
Set<Region> regionsActiveWhenBluetoothDisabled = new HashSet<Region>();
将代码添加到 didExitRegion
并将 didEnterRegion
添加到 add/remove 将区域添加到 regionsActive
变量。
在检测到蓝牙已关闭的代码中执行:
regionsActiveWhenBluetoothDisabled = new HashSet(regionsActive);
在您收到蓝牙已打开的回调的代码中,启动一个定时器 10 秒左右。在此计时器结束时,执行如下操作:
for (Region region: regionsActiveWhenBluetoothDisabled) {
if (!regionsActive.contains(region)) {
// We know we are no longer in a region that we were in when bluetooth was last turned off
// execute code to say we are out of this region
}
}
我有一个 android 应用程序,我在其中检测 foreground/background 中的信标。一切正常,除非我关闭设备上的蓝牙。在这种情况下,它被称为 OnExitRegion,但我不得不忽略它,因为我真的不知道用户在做什么,但如果我远离信标并再次打开蓝牙,onExitRegion 将不会再次被调用,我不会知道我离开了这个区域。
这是我的代码的一部分。
public class MyApplication extends Application implements BootstrapNotifier {
public void onCreate() {
super.onCreate();
...
mBeaconManager = BeaconManager.getInstanceForApplication(this);
mBeaconManager.getBeaconParsers().add(new BeaconParser().
setBeaconLayout(Constants.BEACON_LAYOUT));
mBeaconRegion = new Region(Constants.BEACON_BACKGROUND_REGION, Identifier.parse(Constants.BEACON_UDID), null, null);
regionBootstrap = new RegionBootstrap(this, mBeaconRegion);
backgroundPowerSaver = new BackgroundPowerSaver(this);
mBeaconManager.setBackgroundScanPeriod(Constants.BEACON_BACKGROUND_SCAN_PERIOD);
mBeaconManager.setBackgroundBetweenScanPeriod(Constants.BEACON_BACKGROUND_BETWEEN_SCAN_PERIOD);
mBeaconManager.setAndroidLScanningDisabled(true);
...
}
我尝试创建一个 BroadcastReceiver 来检测蓝牙何时关闭或打开
public class BluetoothBroadcastReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) {
if (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1)
== BluetoothAdapter.STATE_OFF) {
Log.w("BLUETOOTH", "Bluetooth is disconnected");
} else {
Log.w("BLUETOOTH", "Bluetooth is connected");
}
}
}
}
我需要的是检查这个广播接收器,当蓝牙打开时,如果我还在这个区域或者不修改UI。
希望我的解释足够清楚。
非常感谢!
显然,如果蓝牙无线电关闭,Android Beacon Library 无法检测到您是否真的离开了信标区域。但是这里有一个想法,说明一旦蓝牙重新打开,您可以做什么来模拟退出行为:
保留两个应用程序级变量:
Set<Region> regionsActive = new HashSet<Region>(); Set<Region> regionsActiveWhenBluetoothDisabled = new HashSet<Region>();
将代码添加到
didExitRegion
并将didEnterRegion
添加到 add/remove 将区域添加到regionsActive
变量。在检测到蓝牙已关闭的代码中执行:
regionsActiveWhenBluetoothDisabled = new HashSet(regionsActive);
在您收到蓝牙已打开的回调的代码中,启动一个定时器 10 秒左右。在此计时器结束时,执行如下操作:
for (Region region: regionsActiveWhenBluetoothDisabled) { if (!regionsActive.contains(region)) { // We know we are no longer in a region that we were in when bluetooth was last turned off // execute code to say we are out of this region } }