2017-02-20 4 views
0

Я разрабатываю приложение для Android с использованием библиотеки маяков, часть этого приложения собирается искать конкретный маяк через его младший идентификатор (который вводится пользователем через диалог).Android Beacon Library, Null Object Reference при вызове startRangingBeaconsInRegion

Если я пишу все в одной и той же деятельности, все работает нормально, но я бы хотел, чтобы диалоги были отделены во внешнем чистом классе 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, я получил:

попытка вызвать виртуальный метод «недействительным org.altbeacon.beacon.BeaconManager.startRangingBeaconsInRegion (org.altbeacon.beacon.Region)»на нулевой ссылки на объект

последовательность: 1.
пользователю предлагается (через GoogleApiClient), чтобы включить BLE и локализация
2. внутри onActivityResult диалоговое окно для вставки второстепенную ID определен из класса Java 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, но это не кажется мне, что проблема заключается в регионе, потому что я такой же ответ, даже если я устанавливаю обнулить все идентификаторы, так что я не могу понять, почему нулевой Справка.
Возможно ли, что я создаю два разных 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; 
    } 
} 

ответ

0

Вы можете попробовать этот код, чтобы избежать исключения нулевого указателя:

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(); 
      } 
+0

спасибо за предложение, я быстро переставить свой код в соответствии с вашим предложением и получил исключение нулевого указателя на 'setrangeNotifier'; кроме того, я также понял, что использование setRangeNotifier таким образом устарело. – r08y

0

Вопрос не показывает декларацию beaconManager и как он ограничен, поэтому трудно сказать точную причину.

Два советы:

  1. BeaconManager одноэлементно, т.е. есть один экземпляр для каждого процесса Java.Таким образом, вы всегда можете получить этот экземпляр изнутри такого вида деятельности: BeaconManager.getInstanceForApplication(this).startRangingBeaconsInRegion(myRegion);

  2. Вручную создание нового экземпляра Activity, как показано ниже, обычно не работает в Android-программировании. Вы должны создать новый экземпляр Activity, используя Intent. В вашем случае я подозреваю, что вы можете вообще не создавать новый экземпляр Activity, а получать ссылку на существующий. Это может быть не связанно с тем, что вы просите, но это, безусловно, должно быть изменено: Activity03 a03 = new Activity03(); a03.scanForBeacon(context, minorId);

+0

действительно спасибо за ваш быстрый ответ и ваши предложения. См. Выше. Я редактировал свой вопрос. Я также повторю попытку получения новой ссылки на действия «Intent». – r08y