创建一个应用程序,它只在一个特定的iBeacon后台扫描 . 但在Activity中,我可以将其更改为我想要扫描的内容 . 我正在使用altbeacon库和示例代码 . 已经让它扫描特定的iBeacon,但我无法让它改变Region .

我能想到的一种方法是获取全局静态字符串 . 这样我就可以在绑定后编辑和beaconManager将拥有新的Region . (How to create a global variable in android?)但我只能得到..没有设置..,在我将其空摧毁之后 .

其他方法是直接在Activity中执行,单击Save后它只是更改它 . 但这似乎不起作用 .

iBeaconReader.java

public class iBeaconReader extends Application implements BootstrapNotifier {

private static final String TAG = "BeaconReferenceApp";
private BeaconManager beaconManager;
private RegionBootstrap regionBootstrap;
private BackgroundPowerSaver backgroundPowerSaver;

public void onCreate() {
    super.onCreate();
    beaconManager = BeaconManager.getInstanceForApplication(this);
    beaconManager.setBackgroundMode(true);
    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.setBackgroundBetweenScanPeriod(1000l);
    beaconManager.setBackgroundScanPeriod(1000L);
    beaconManager.bind(this);

    Identifier identifier = Identifier.parse("9B749762-760E-4AD8-A221-000000000000");   // I dont want to find this. 
    Region region = new Region("null", null, null, null);                               // But I have to set it up

    regionBootstrap = new RegionBootstrap(this, region);

    backgroundPowerSaver = new BackgroundPowerSaver(this);

}

@Override
public void didEnterRegion(Region region) {
    if(!region.getUniqueId().equals("null")) {
        Log.d(TAG, "In Range- " + region);
    }
}

@Override
public void didExitRegion(Region region) {
    if(!region.getUniqueId().equals("null")) {
        Log.d(TAG, "Out of Range- " + region);
    }
}

@Override
public void didDetermineStateForRegion(int i, Region region) {

}
}

MainActivity.java

public class MainActivity extends Activity implements BeaconConsumer {
...

@Override
protected void onCreate(Bundle savedInstanceState) {
    beaconManager = BeaconManager.getInstanceForApplication(this);
    beaconManager.bind(this);

...

@Override
protected void onDestroy() {
    super.onDestroy();
    beaconManager.unbind(this);
}

...
@Override
public void onBeaconServiceConnect() {
    try {
        beaconManager.stopMonitoringBeaconsInRegion(new Region("backgroundRegion", null, null, null));
        Identifier identifier = Identifier.parse("9B749762-760E-4AD8-A221-91E0F210134C"); //mini beacon
        beaconManager.startMonitoringBeaconsInRegion(new Region("backgroundRegion", identifier, null, null));
    } catch (RemoteException e) {
        Log.e("BeaconReferenceApp", e.getMessage(), e);
    }
}

我搞定了 . 当 onBeaconServiceConnect() 函数被调用时,我必须做 beaconManager.stopMonitoringBeaconsInRegion(new Region("backgroundRegion", null, null, null)) . 当我没有't stopMonitoring, it didn't改变监控区域 .