当 运行 BeaconManager.bind 在方法 ALTBeacon 中时出错

Error when running BeaconManager.bind inside a method ALTBeacon

我的扫描器 class 扩展了 Application 并实现了 BeaconConsumer。当我尝试绑定或取消绑定 BeaconManager 时,我得到一个 NullPointerException。

public class Scanner extends Application implements BeaconConsumer{
private BeaconManager beaconManager;

@Override
public void onCreate() {
    try {
        super.onCreate();

        beaconManager = BeaconManager.getInstanceForApplication(this);
        beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout(" m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));

    }
    catch (Exception e){
        e.printStackTrace();
    }

}


public void startScan(long period){
    try {
        if (beaconManager==null) {
            beaconManager = BeaconManager.getInstanceForApplication(Scanner.this);
            beaconManager.bind(Scanner.this);
            beaconManager.setForegroundScanPeriod(period);
            beaconManager.updateScanPeriods();
        }
    }
    catch (Exception e){
        e.printStackTrace();
    }
}

public void stopScan(){
    beaconManager.unbind(Scanner.this);
}

我收到以下错误:

W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'void org.altbeacon.beacon.BeaconManager.bind(org.altbeacon.beacon.BeaconConsumer)' on a null object reference

我怀疑问题是 Scanner class 运行 有多个实例。一般来说,您不应该手动创建 Android 应用程序 class 的实例(扩展应用程序的实例)。您在 AndroidManifest.xml 中声明这样一个 class,并让 Android OS 在启动应用程序时实例化它。如果您通过调用其构造函数手动实例化 class,则不会调用 onCreate() 方法并且不会创建 beaconManager

如果您想从 Activity 中获取此 class 的实例,以便您可以调用 startScan()stopScan() 等方法,您可以使用:

Scanner scanner = (Scanner) this.getApplication();

还要注意代码编写方式的另外两个问题:

  1. 如果调用 startScan()stopScan()startScan(),第二次 startScan() 调用不会发生任何事情,因为 beaconManager 会不是零。扫描不会重新启动。

  2. 调用beaconManager.updateScanPeriods();如果之前的异步bind(...);调用还没有完成(一般不会)就会失败,导致代码落入catch块.一个简单的解决方法是删除对 beaconManager.updateScanPeriods(); 的调用,只需将 beaconManager.setForegroundScanPeriod(period); 调用移动到对 bind(...).

  3. 的调用之前