Android AltBeacon Ranging ничего не находит

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

@Override
public void onBeaconServiceConnect() {
    beaconManager.addRangeNotifier(new RangeNotifier() {
        @Override
        public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
            if (beacons.size() == 0) {
                Log.i("ActivityMain", "no beacons found");
            }
            if (beacons.size() > 0) {
                Log.i("ActivityMain", "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.getBeaconParsers().add(new BeaconParser(BeaconParser.ALTBEACON_LAYOUT));
    beaconManager.getBeaconParsers().add(new BeaconParser(BeaconParser.EDDYSTONE_TLM_LAYOUT));
    beaconManager.getBeaconParsers().add(new BeaconParser(BeaconParser.EDDYSTONE_UID_LAYOUT));
    beaconManager.getBeaconParsers().add(new BeaconParser(BeaconParser.EDDYSTONE_URL_LAYOUT));
    beaconManager.getBeaconParsers().add(new BeaconParser(BeaconParser.URI_BEACON_LAYOUT));
    beaconManager.getBeaconParsers().add(new BeaconParser().
            setBeaconLayout("m:0-3=4c000215,i:4-19,i:20-21,i:22-23,p:24-24"));

    beaconManager.bind(this);

Я указал следующие разрешения в манифесте:

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

И прямо сейчас в моей комнате есть несколько маяков, как Eddystone, так и iBeacon. Ни один из них не найден после вызова startRangingBeaconsInRegion(...)

D/BluetoothLeScanner: could not find callback wrapper довольно часто появляется в logcat, если это какой-либо показатель. Дело в том, что callback вроде бы найден, потому что я точно знаю, что этот кусок кода

if (beacons.size() == 0) {
                    Log.i("ActivityMain", "no beacons found");
                }

выполняется раз в секунду. Я пробовал это приложение Beacon Scanner. который также использует AltBeacon и отлично находит мои маяки. Я проверил его источник, и ему не нравится, что происходит что-то, чего я не делаю сам, хотя другое приложение использует kotlin, а я использую java.

Я пытался сделать это как на Moto G3, так и на Galaxy S7, и мне не повезло ни с одним из них.

Что может быть причиной этого?


person user3340459    schedule 09.01.2018    source источник
comment
Убедитесь, что вы успешно получили разрешение на определение местоположения динамически, как описано в моем ответе здесь: stackoverflow.com/a/33150570   -  person davidgyoung    schedule 09.01.2018
comment
@davidgyoung Я реализовал ваше предложение как для грубых, так и для точных разрешений на местоположение. Теперь LogCat каждую секунду показывает новую строку: D/BluetoothLeScanner: onClientRegistered() - status=0 clientIf=5, однако didRangeBeaconsInRegion по-прежнему каждый раз возвращает пустой список.   -  person user3340459    schedule 09.01.2018
comment
Чтобы было ясно, разрешение на местоположение должно быть получено динамически, заставляя операционную систему открывать диалоговое окно для пользователя и заставляя их активно щелкать, чтобы согласиться разрешить приложению использовать местоположение. Вы можете проверить, было ли это успешно выполнено приложением, перейдя в «Настройки» -> «Приложения» -> [Имя вашего приложения] -> «Разрешения» и убедившись, что переключатель «Местоположение» находится в положении «включено». Вам также необходимо убедиться, что параметр глобального местоположения телефона находится в положении «включено» в верхней части «Настройки» -> «Местоположение».   -  person davidgyoung    schedule 09.01.2018
comment
@davidgyoungSettings -> Приложения -> [Мое приложение] показывает переключатель местоположения во включенном положении. Настройки-›Местоположение включено, режим говорит высокая точность. Мое приложение не указано в последних запросах на определение местоположения, как и другие приложения для сканирования маяков, которые я пробовал.   -  person user3340459    schedule 09.01.2018
comment
Хорошо, я согласен, что теперь разрешения звучат так, как будто они установлены правильно. Я изо всех сил пытаюсь понять, что еще может быть не так... вы уверены, что приложение Beacon Scanner может обнаружить маяки прямо сейчас? Возможно, стек Bluetooth находится в плохом состоянии, что может потребовать цикла включения / выключения Bluetooth, но в этом случае это должно быть верно и для приложения Beacon Scanner.   -  person davidgyoung    schedule 10.01.2018