簡體   English   中英

Android Beacon庫,調用startRangingBeaconsInRegion時為空對象參考

[英]Android Beacon Library, Null Object Reference when calling startRangingBeaconsInRegion

我正在使用信標庫開發一個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類DialogUtilities中選擇用於插入次要ID的對話框。
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的問題,因為即使我將所有Identifiers設置為null,我的響應也相同,所以我無法理解為什么使用null引用。
是否可能由於Dialog返回的活動的距離而創建兩個不同的BeaconMangers? 如果可以,我該如何解決?
如果沒有,如何避免此空對象引用?
提前致謝

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

您可以嘗試下面的代碼來避免空指針異常:

  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進程有一個實例。 因此,您始終可以從這樣的Activity中獲取此實例: BeaconManager.getInstanceForApplication(this).startRangingBeaconsInRegion(myRegion);

  2. 如下所示,手動構造一個新的Activity實例通常無法在Android編程中使用。 您必須使用Intent創建新的Activity實例。 對於您的情況,我懷疑您可能根本不想創建一個新的Activity實例,而只是想獲得對現有實例的引用。 這可能與您的要求無關,但是肯定需要更改: Activity03 a03 = new Activity03(); a03.scanForBeacon(context, minorId); Activity03 a03 = new Activity03(); a03.scanForBeacon(context, minorId);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM