Библиотека Android Beacon не обнаруживает iBeacon! не честно :(

Я пытаюсь использовать Android Beacon Library для обнаружения iBeacons, но это не работает.

Вывод из logcat просто:

I/SELinux﹕ Function: selinux_android_load_priority [0], There is no sepolicy file. I/SELinux﹕ Function: selinux_android_load_priority , spota verifySig and checkHash pass. priority version is VE=SEPF_GT-I9195_4.4.2_0046 I/SELinux﹕ selinux_android_seapp_context_reload: seapp_contexts file is loaded from /data/security/spota/seapp_contexts E/dalvikvm﹕ >>>>> Normal User E/dalvikvm﹕ >>>>> com.cyberland.felix.ibeaconexample [ userId:0 | appId:10176 ] D/dalvikvm﹕ Late-enabling CheckJNI I/PersonaManager﹕ getPersonaService() name persona_policy D/BeaconParser﹕ Parsing beacon layout: m:2-3=beac,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25 D/BeaconParser﹕ Parsing beacon layout: m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24 W/ModelSpecificDistanceCalculator﹕ Cannot find match for this device. Using default W/ModelSpecificDistanceCalculator﹕ Cannot find match for this device. Using default E/MonitoringStatus﹕ Deserialization exception, message: $s

А потом просто

D/BluetoothAdapter﹕ stopLeScan()

опять и опять...

Я только что изменил пример с официальной страницы:

public class MainActivity extends Activity implements BeaconConsumer {
protected static final String TAG = "MainActivity";
private BeaconManager beaconManager;
private static final int PERMISSION_REQUEST_COARSE_LOCATION = 1;

private BluetoothAdapter mBluetoothAdapter;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    /*
    mBluetoothAdapter = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)).getAdapter();
    mBluetoothAdapter.startLeScan(new BluetoothAdapter.LeScanCallback() {
        @Override
        public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {
            Log.d(TAG, "Scanned BLE device with mac: " + device.getAddress());
        }
    });
     */
    beaconManager = BeaconManager.getInstanceForApplication(this);
    beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));
    beaconManager.bind(this);




}


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

}


@Override
public void onBeaconServiceConnect() {
    beaconManager.setRangeNotifier(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("myRangingUniqueId", null, null, null));
    } catch (RemoteException e) {    }
}

Я надеюсь, что вы можете помочь мне!

С уважением, Феликс


person Cyberlander    schedule 16.04.2016    source источник
comment
Какая версия Android на вашем телефоне? Что вы увидите, если зайдете в «Настройки» -> «Местоположение»? Включено или выключено определение местоположения и в каком режиме оно находится — высокая точность, только устройство или экономия заряда батареи?   -  person davidgyoung    schedule 16.04.2016
comment
В телефоне 4.4.2 (Samsung S4 Mini), Местоположение высокая точность. Я смог найти iBeacon с помощью приложения из PlayStore.   -  person Cyberlander    schedule 16.04.2016


Ответы (2)


Похоже, проблема может быть связана с отсутствием соответствующих разрешений для сканирования на вашем устройстве. Чтобы проверить эту теорию, добавьте следующий код в метод onCreate вашего основного действия и посмотрите, что он вернет. Ниже показан пример вывода того, что я вижу на своем Nexus 5X.

        try {
            PackageInfo info = getPackageManager().getPackageInfo(this.getPackageName(), PackageManager.GET_PERMISSIONS);
            Log.d(TAG, "SDK "+Build.VERSION.SDK_INT+" App Permissions:");
            if (info.requestedPermissions != null) {
                for (String p : info.requestedPermissions) {
                    int grantResult = this.checkPermission(p, android.os.Process.myPid(), android.os.Process.myUid());
                    if (grantResult == PackageManager.PERMISSION_GRANTED) {
                        Log.d(TAG, p+" PERMISSION_GRANTED");
                    }
                    else {
                        Log.d(TAG, p+" PERMISSION_DENIED: "+grantResult);
                    }
                }
            }
        } catch (Exception e) {
            Log.d(TAG, "Cannot get permissions due to error", e);
        }

Пример вывода:

04-17 12:04:01.943 30624-30624/? D/MonitoringActivity: SDK 23 App Permissions:
04-17 12:04:01.944 30624-30624/? D/MonitoringActivity: android.permission.INTERNET PERMISSION_GRANTED
04-17 12:04:01.945 30624-30624/? D/MonitoringActivity: android.permission.BLUETOOTH PERMISSION_GRANTED
04-17 12:04:01.945 30624-30624/? D/MonitoringActivity: android.permission.BLUETOOTH_ADMIN PERMISSION_GRANTED
04-17 12:04:01.946 30624-30624/? D/MonitoringActivity: android.permission.RECEIVE_BOOT_COMPLETED PERMISSION_GRANTED
04-17 12:04:01.946 30624-30624/? D/MonitoringActivity: android.permission.ACCESS_COARSE_LOCATION PERMISSION_GRANTED

Если вы видите, что какое-либо из вышеперечисленных разрешений отсутствует в выводе на вашем устройстве, решением может быть добавление ACCESS_COARSE_LOCATION разрешений местоположения вручную в ваш AndroidManifest.xml. Если вы видите PERMISSION_DENIED, это может быть другая проблема. Вы можете пропустить проверку разрешений перед запуском сканирования маяков на своем устройстве, что станет возможным, если временно понизить версию библиотеки Android Beacon Library до версии 2.7, которая не выполняет эту проверку.

person davidgyoung    schedule 17.04.2016
comment
Вы говорите, что разрешение отсутствовало в выводе отладки? Или вы говорите, что в разрешении было ОТКАЗАНО? Кроме того, вы используете Android Studio или Eclipse? Извините за последующие действия, но я хотел бы точно понять, какая у вас возникла проблема и как вы ее исправили, чтобы я мог помочь другим. - person davidgyoung; 17.04.2016
comment
Разрешение отсутствовало, и я использую Android Studio. У меня была такая же проблема с Eclipse. Добавление разрешения ACCESS_COARSE_LOCATION в манифест решило проблему. - person Cyberlander; 18.04.2016

Хм, официальный пример (android-beacon-library-reference) выдает тот же результат. Я не могу это объяснить.

person Cyberlander    schedule 17.04.2016