我正在使用信标库开发一个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的对话框 DialogUtilitiesDialogUtilities.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();
}
}
在我看来,问题是关于Region的,因为即使我将所有标识符设置为null,我也有相同的响应,所以我无法理解为什么null引用 .
我是否有可能创建两个不同的BeaconMangers,因为我通过Dialog返回的活动是什么?如果是这样我怎么解决呢?
如果没有,如何避免这个空对象引用?
提前致谢
EDIT
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 回答
您可以尝试以下代码以避免空指针异常:
这个问题没有显示
beaconManager
的声明以及它是如何确定范围的,因此很难说确切的原因 .两个提示:
BeaconManager
是一个单例,意味着每个Java进程都有一个实例 . 因此,您始终可以在Activity中获取此实例,如下所示:BeaconManager.getInstanceForApplication(this).startRangingBeaconsInRegion(myRegion);
如下所示手动构建一个新的Activity实例通常不适用于Android编程 . 您必须使用
Intent
创建新的Activity实例 . 在您的情况下,我怀疑您可能根本不想创建新的Activity实例,而是要获取对现有实例的引用 . 这可能与您提出的要求无关,但肯定需要更改:Activity03 a03 = new Activity03(); a03.scanForBeacon(context, minorId);