Маяки не показывают Altbeacon

Я пытаюсь заставить код работать с демонстрационным кодом, предоставленным Altbeacon. Обычно он должен что-то регистрировать, но этого не происходит. Что он показывает в logcat, так это

01-11 20:50:33.964 12498-12508/com.example.thomas.test1 D/BluetoothLeScanner: onScanResult() - ScanResult{mDevice=EF:47:2A:56:1B:55, mScanRecord=ScanRecord [mAdvertiseFlags=6, mServiceUuids=[0000feaa-0000-1000-8000-00805f9b34fb], mManufacturerSpecificData={29540=[5, -86, -69, -52, -35, -18, -1, 0, 17, 34, 51, 68]}, mServiceData={0000feaa-0000-1000-8000-00805f9b34fb=[16, -30, 0, 103, 111, 111, 103, 108, 101, 0]}, mTxPowerLevel=-30, mDeviceName=Beacon1], mRssi=-26, mTimestampNanos=981220542678629}

Таким образом, он обнаруживает маяк, но не показывает его в виде журнала.

Код, который я использовал:

открытый класс MainActivity расширяет AppCompatActivity, реализует BeaconConsumer{

protected static final String TAG = "RangingActivity";
private BeaconManager beaconManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    beaconManager = BeaconManager.getInstanceForApplication(this);

    beaconManager.bind(this);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    beaconManager.unbind(this);
}

@Override
public void onBeaconServiceConnect() {
    beaconManager.addRangeNotifier(new RangeNotifier() {
        @Override
        public void didRangeBeaconsInRegion(Collection<Beacon> 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("0000feaa-0000-1000-8000-00805f9b34fb", null, null, null));
    } catch (RemoteException e) {
        e.printStackTrace();
    }
}

Кто-нибудь знает, что я сделал неправильно? Заранее спасибо!


person Thomas Van Raemdonck    schedule 11.01.2018    source источник


Ответы (1)


Несколько вещей, которые нужно проверить:

  1. Вам нужно добавить синтаксические анализаторы маяков для кадров Eddystone, которые вы хотите обнаружить, в метод onCreate.

    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      beaconManager = BeaconManager.getInstanceForApplication(this);
      beaconManager.getBeaconParsers().add(new BeaconParser().
        setBeaconLayout(BeaconParser.EDDYSTONE_UID_LAYOUT));
      beaconManager.getBeaconParsers().add(new BeaconParser().
        setBeaconLayout(BeaconParser.EDDYSTONE_URL_LAYOUT));
      beaconManager.bind(this);
    }
    
  2. Убедитесь, что вы запросили правильные разрешения динамически, что необходимо, если вы используете Android 6+. Инструкции для этого находятся здесь: https://altbeacon.github.io/android-beacon-library/requesting_permission.html

  3. Добавьте строку журнала в начало onBeaconServiceConnect(), чтобы убедиться, что она вызывается.

person davidgyoung    schedule 11.01.2018
comment
Спасибо, теперь это работает с моим телефоном, но когда я хочу запустить приложение с телефоном друга, оно говорит: BluetoothLeScanner: не удалось найти оболочку обратного вызова. Любая идея, что может вызвать это? - person Thomas Van Raemdonck; 12.01.2018
comment
У него андроид 7.0, а у меня андроид 5.5. - person Thomas Van Raemdonck; 12.01.2018
comment
Android 5.5 не требует разрешений на динамическое определение местоположения, как описано в пункте 2. Android 7 требует. В этом, наверное, разница. Прочтите ссылку на пункт 2. - person davidgyoung; 12.01.2018
comment
Спасибо, это помогло, не могли бы вы помочь мне еще раз? Я хочу записать значения rssi в базу данных, код для записи работает, но когда я хочу записать данные в базу данных, приложение вылетает. Может ли быть так, что комбинация сканирования маяков и записи чего-то еще может вызвать проблему? Вы знаете, как решить эту проблему? - person Thomas Van Raemdonck; 21.01.2018
comment
Я не думаю, что сбой имеет какое-либо отношение к сканированию, он, вероятно, связан с записью в базу данных, если он начал сбой после того, как вы добавили этот код. Я предлагаю вам опубликовать новый вопрос, показывающий фрагмент кода, включая строку, указанную в верхней части трассировки стека. - person davidgyoung; 21.01.2018