Android Beacon库,呼叫StartrangingBeaconSinregion时null对象引用



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

如果我在相同的活动中编写所有内容,事情都可以正常工作,但是我想在外部纯Java类中分开对话框,因此在实现Beacconsumer的活动中,我添加了一个"方法"创建和绑定信标管理器。

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.beacon.gregion)'null对象参考

序列是:
1.要求用户(通过googleapiclient)打开BLE和本地化
2. Inside onActivityResult 从Java类 Dialogutilities
选择了用于插入次要ID的对话框 DialogUtilities.showSelectionDialog(Activity03.this);
3.按下按钮对话框被删除,创建了BeacconSumer活动的实例,并称为:
Activity03 a03 = new Activity03(); a03.scanForBeacon(context, minorId);
4.当 onbeconserviceconnect()被称为我在 startrangtrangingbeaconsinregion

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

我是Java和Android的新手,但在我看来,问题与该区域有关,因为即使我设置了所有标识符,我也有相同的响应,因此我无法理解为什么null参考。<<<<<<<<<<<<<<
由于我通过对话返回活动的持续存在,我是否有可能创建两个不同的信标?如果是这样,我该如何解决?
如果没有,如何避免此空对象引用?
预先感谢

编辑
Beacmanager声明

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;
    }
}

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

  beaconManager.setRangeNotifier(new RangeNotifier() {
              @Override
              public void didRangeBeaconsInRegion(Collection beacons, Region region) {
                  if (beacons.size() > 0) {
                      Log.i(TAG, "The first beacon I see is about "+beacons.iterator().next().getDistance()+" meters away.");
                  }
              }
          });
          try {
              beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null));
          } catch (RemoteException e) {
              e.printStackTrace();
          }

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

两个提示:

  1. BeaconManager是单身人士,这意味着每个Java过程有一个实例。因此,您随时可以从这样的活动中获得此实例:BeaconManager.getInstanceForApplication(this).startRangingBeaconsInRegion(myRegion);

  2. 手动构建新的活动实例,如下所示,通常在Android编程中不起作用。您必须使用Intent创建新的活动实例。在您的情况下,我怀疑您可能根本不想创建一个新的活动实例,而是要参考现有活动。这可能与您的要求无关,但肯定需要更改:Activity03 a03 = new Activity03(); a03.scanForBeacon(context, minorId);

相关内容

  • 没有找到相关文章

最新更新