调用startRangingBeaconsInRegion时的Android Beacon Library,Null Object Reference

时间:2017-02-20 11:39:20

标签: java android altbeacon

我正在使用信标库开发一个Android应用程序,该应用程序的一部分即将通过其次要ID(用户通过对话框插入)搜索特定信标。

如果我在同一个活动中编写所有东西,一切正常但我想在外部纯java类中保持对话框分开,所以在实现BeaconConsumer的活动中,我添加了一个“方法”来创建和绑定信标管理器。

public class Activity03 extends AppCompatActivity
    implements BeaconConsumer, RangeNotifier {

    ...

    public void scanForBeacon(Context context, String selectedMinorId){
        beaconManager = BeaconManager.getInstanceForApplication(context);

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

        Identifier minorIdFilter = Identifier.parse(selectedMinorId);

        myRegion = new Region(
            "my_region",
             null,
             null,
             minorIdFilter);

        beaconManager.bind((BeaconConsumer) context);
    }
    ...
}

关键是,当调用 startRangingBeaconsInRegion 时,我得到了:

  

尝试在空对象引用上调用虚方法'void org.altbeacon.beacon.BeaconManager.startRangingBeaconsInRegion(org.altbeacon.beacon.Region)'

顺序是:
1.要求用户(通过GoogleApiClient)打开BLE和本地化 2.在 onActivityResult 内部,从java类中选择用于插入次要ID的对话框 DialogUtilities
DialogUtilities.showSelectionDialog(Activity03.this);
3.按下按钮对话框,创建BeaconConsumer活动的实例并调用方法:
Activity03 a03 = new Activity03(); a03.scanForBeacon(context, minorId);
4.当 onBeaconServiceConnect()被调用时,我在 startRangingBeaconsInRegion

的行上得到了空对象引用
@Override
public void onBeaconServiceConnect() {
    try {
        beaconManager.startRangingBeaconsInRegion(myRegion);
    } catch (RemoteException e) {
        e.printStackTrace();
    }
}

我是java和android的新手,但在我看来问题不在于Region,因为即使我将所有标识符设置为null,我也有相同的响应,所以我无法理解为什么空引用。登记/> 我是否有可能创建两个不同的BeaconMangers,因为我通过Dialog返回的活动是什么?如果是这样我怎么解决呢? 如果没有,如何避免这个空对象引用?
提前致谢

修改
BeaconManager声明

public class Activity03 extends AppCompatActivity implements BeaconConsumer, RangeNotifier {
    static final int REQUEST_CHECK_SETTINGS = 1000;

    private BeaconManager beaconManager;
    private Region myRegion;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTheme(R.style.AppTheme);
        setContentView(R.layout.activity_03);
    }

    @Override
    protected void onResume() {
          @Override
          super.onResume();
          PermissionsUtilities.switchLocationAndBluetooth(Activity03.this);

    }


    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        final LocationSettingsStates states = LocationSettingsStates.fromIntent(data);
        switch (requestCode) {
            case REQUEST_CHECK_SETTINGS:
                switch (resultCode) {
                    case Activity.RESULT_OK:
                          DialogUtilities.showSensorSelectionDialog(Activity03.this);
                    break;
                case Activity.RESULT_CANCELED:
                    ...
                    break;
                default:
                    break;
            }
            break;
    }
}

2 个答案:

答案 0 :(得分:0)

您可以尝试以下代码以避免空指针异常:

<access origin="*"/>
<allow-intent href="http://*/*"/>
<allow-intent href="https://*/*"/>
<allow-intent href="tel:*"/>
<allow-intent href="sms:*"/>
<allow-intent href="mailto:*"/>
<allow-intent href="geo:*"/>
<allow-intent href="market:*"/>
<allow-intent href="data:*"/>
<allow-intent href="*://*.ezhealthpal.com/*"/>
<allow-intent href="*://*.media.twiliocdn.com/*"/>
<allow-intent href="*://*.apis.google.com/*"/>
<allow-intent href="video:*"/>
<allow-intent href="audio:*"/>
<allow-intent href="blob:*"/>
<allow-intent href="*"/>
<allow-navigation href="*"/>

答案 1 :(得分:0)

这个问题没有显示beaconManager的声明及其范围如何,因此很难说确切的原因。

两个提示:

  1. BeaconManager是一个单例,意味着每个Java进程都有一个实例。因此,您始终可以在以下活动中获取此实例:BeaconManager.getInstanceForApplication(this).startRangingBeaconsInRegion(myRegion);

  2. 手动构建如下所示的新Activity实例通常不适用于Android编程。您必须使用Intent创建新的Activity实例。在您的情况下,我怀疑您可能根本不想创建新的Activity实例,而是要获取对现有实例的引用。这可能与您提出的问题无关,但肯定需要更改:Activity03 a03 = new Activity03(); a03.scanForBeacon(context, minorId);