Проблемы с образцом AltBeacon, работающим на симуляторе

Я использую Android Studio (IntelliJ) IDE для создания приложения для Android, которое использует AltBeacon для обнаружения маяков. Я пробую этот пример и пытаюсь понять его основы. Я запускаю образец симулятора Android (ADT 1.1.0 и gradle 2.2.1). Когда я включаю TimedBeaconSimulator, я вижу их после нажатия на Start Ranging. Есть некоторые вещи, которые я заметил, которые немного сбивают с толку -

а) Всегда показывает Id3:2 и Id3:3, и никогда 1 и 4, хотя все они добавлены в список маяков.

б) Когда приложение закрывается, оно вылетает, не знаю почему.

c) Насколько я понимаю, MonitoringActivity предназначен для обнаружения маяков в фоновом режиме. Но этого не происходит. Разве он не создан для обнаружения симулированных маяков (которые являются частью выборки)? Я попытался добавить эти строки в AndroidManifest.xml (ссылка), но ниже ошибка при сборке gradle -

 Error:(35, 41) Execution failed for task ':app:processDebugManifest'.
> Manifest merger failed : Attribute service#org.altbeacon.beacon.service.BeaconService@exported value=(true) from AndroidManifest.xml:35:41
is also present at org.altbeacon:android-beacon-library:2.1.4:27:13 value=(false)
Suggestion: add 'tools:replace="android:exported"' to <service> element at AndroidManifest.xml:35:9 to override

Пожалуйста, помогите с этим. Я очень новичок в маяках и пытаюсь понять эти концепции.

Редактировать

Дэвид, чтобы обойти проблему сбоя приложения из-за помех сканированию Android L BLE, я добавил эту проверку в свой код:

 public boolean IsBLESupportedOnDevice(Context context) {
     if (Build.VERSION.SDK_INT >= 19 && context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE))    
     {
          Log.d(TAG, "BLE is supported, so need to disable L scanning");
          return true;
     }
     return false;
 }

Если он возвращает true, я добавляю строку ниже в коде -

beaconManager.setAndroidLScanningDisabled(true);

Можете ли вы проверить, хорошо ли выглядит уровень API и остальные условия?


person Sam    schedule 12.04.2015    source источник


Ответы (1)


A) Причина, по которой вы не видите все маяки, заключается в том, что пример кода показывает только первый маяк в обратном вызове ранжирования. Если вы хотите увидеть их все, измените код в обратном вызове ранжирования, чтобы он выглядел следующим образом:

    public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
        for (Beacon beacon: beacons) {
            EditText editText = (EditText)RangingActivity.this
                    .findViewById(R.id.rangingText);
            logToDisplay("I see a beacon "+beacon.toString()+" about "+beacon.getDistance()+" meters away.");            }
    }

Б) Я не уверен, что вы подразумеваете под «закрытием приложения», что приводит к его сбою. Вы можете нажать кнопку «Домой», чтобы проверить ее работу в фоновом режиме. Если вы используете переключатель задач, чтобы убить приложение, то да, это приведет к тому, что оно перестанет работать. Автоматический перезапуск обнаружения маяка после того, как приложение было уничтожено с помощью переключателя задач, очень сложно протестировать в эмуляторе.

C) Вам не нужно добавлять записи в AndroidManifest.xml, которые вы описываете. Тот факт, что вы видели какие-либо обнаружения маяков с помощью TimedBeaconSimulator, указывает на то, что ваш файл манифеста настроен правильно. Пожалуйста, удалите эти добавленные вручную записи. (Они нужны только в том случае, если автоматическое слияние манифестов по какой-то причине не удается.)

Да, вы можете использовать BeaconSimulator для обнаружения маяков в фоновом режиме, но пример TimedBeaconSimulator может быть не лучшим способом попробовать это, потому что он сразу обнаруживает маяки. Чтобы это работало лучше, измените этот код:

0, 10, TimeUnit.SECONDS

to:

30, 10, TimeUnit.SECONDS

Из-за чего потребуется 30 секунд, чтобы обнаружить первый маяк. Затем запустите приложение в симуляторе и нажмите кнопку «Домой», чтобы перевести его в фоновый режим. В течение 30 секунд вы должны увидеть всплывающее окно приложения при обнаружении маяка.

person davidgyoung    schedule 13.04.2015
comment
Теперь я разобрался с пунктом (а). Я все еще сталкиваюсь с проблемами закрытия приложения при нажатии кнопки «Домой» или использовании переключателя задач. Ошибка заключается в попытке вызвать виртуальный метод android.bluetooth.le.BluetoothLeScanner android.bluetooth.BluetoothAdapter.getBluetoothLeScanner() для нулевой ссылки на объект. Я не уверен, что это только на симуляторе. - person Sam; 13.04.2015
comment
Кроме того, я восстановил androidmanifest и изменил задержку в timedbeacon с 0 до 30, но даже несмотря на то, что активность мониторинга автоматически вызывается через 30 секунд, когда приложение уже открыто, но не когда приложение находится в фоновом режиме. Это может быть связано с ошибкой, которую я получаю выше. - person Sam; 13.04.2015
comment
Попробуйте добавить beaconManager.setAndroidLScanningDisabled(true); в метод onCreate BeaconReferenceApplication.java сразу после строки BeaconManager beaconManager = org.altbeacon.beacon.BeaconManager.getInstanceForApplication(this);. Это должно решить проблему сбоя, вызванную несовместимостью с использованием BeaconSimulator, когда API-интерфейсы Android 5 активны. Тем временем я открыл проблему, чтобы исправить эту несовместимость здесь: github.com/AltBeacon /android-beacon-library/issues/165 - person davidgyoung; 13.04.2015
comment
Это работает. Однако один вопрос: будет ли это работать, если я ориентируюсь на API ‹ 21. Нужно ли мне проверять платформу, на которой работает приложение, а затем добавлять условие или оно делает это автоматически? - person Sam; 13.04.2015
comment
Библиотека отлично работает с API 19+. Если вы ориентируетесь на устройства с более ранними версиями Android, вам необходимо проверить эту версию, прежде чем выполнять вызовы API. Подробнее см. здесь: altbeacon.github.io/android-beacon-library / - person davidgyoung; 13.04.2015
comment
Конечно. Большое спасибо, Дэвид. - person Sam; 13.04.2015
comment
Не могли бы вы проверить Edit в моем исходном сообщении. - person Sam; 20.04.2015
comment
Как правило, в таких случаях лучше публиковать новые вопросы. Для краткости я скажу, что код в значительной степени не нужен — вы можете безопасно отключить сканирование Android L без каких-либо проверок! Но если вы хотите включить такой код, вы должны знать, что Android L начинается с уровня API 20, а не 19. - person davidgyoung; 20.04.2015
comment
Конечно, просто добавил уровень API в качестве дополнительной проверки, чтобы убедиться, что нет никаких сюрпризов. Большое спасибо еще раз. - person Sam; 21.04.2015