2014-10-13 3 views
1

Я использую библиотеку Android IBeacon для проекта. Мне нужно создать Службу, начинающуюся в диапазоне для маяков в фоновом режиме и уведомлять пользователя, когда он найдет один (ближайший). Я много искал и кодировал на основе многих примеров, которые я нашел, но все же он не работает. Используя журналы, я обнаружил, что IBeaconManager не связывается, поэтому onIBeaconServiceConnect никогда не вызывается. Я уже пробовал некоторые решения, которые я нашел здесь, но ни один из них не был полезен. Я был бы очень признателен, если бы кто-то помог мне решить эту проблему. Я отправляю часть моего кода здесьИспользование библиотеки Android IBeacon на службе

 
public class RangingService extends Service implements IBeaconConsumer 
{
private IBeaconManager beaconManager;

@Override public void onCreate() { super.onCreate(); beaconManager = IBeaconManager.getInstanceForApplication(this); Log.d("RangingService","Created beaconManager instance"); beaconManager.setBackgroundBetweenScanPeriod(120000); beaconManager.setBackgroundScanPeriod(30000); beaconManager.bind(this); if(beaconManager.isBound(this)) { Log.d("RangingService","Beacon manager bound"); } else { Log.d("RangingService","Beacon manager not bound"); } //Show the service has started notify("RangingService created", "RangingService has started"); } @Override public void onDestroy() { super.onDestroy(); beaconManager.unBind(this); } @Override public void onIBeaconServiceConnect() { Log.d("RangingService", "Entering onIBeaconServiceConnect"); beaconManager.setRangeNotifier(new RangeNotifier() { @Override public void didRangeBeaconsInRegion(Collection<IBeacon> beacons, Region region) { if(beacons.size() > 0) { IBeacon nearestBeacon = beacons.iterator().next(); for(IBeacon b : beacons) { if(nearestBeacon.getProximity() == IBeacon.PROXIMITY_UNKNOWN) { nearestBeacon = b; } else { if(b.getProximity() != IBeacon.PROXIMITY_UNKNOWN) { if(b.getAccuracy() < nearestBeacon.getAccuracy()) { nearestBeacon = b; } } } } Log.d("RangingService","Nearest Beacon Found "+nearestBeacon.getMajor()+";"+nearestBeacon.getMinor()); notify("Beacon read","Major: "+nearestBeacon.getMajor()+"; Minor: "+nearestBeacon.getMinor()); } else { Log.d("RangingService","No beacons"); } } }); try { Log.d("RangingService", "Entering startRangingBeacons"); beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null)); } catch(RemoteException e) { notificar("Error", e.getMessage()); Log.e("RangingService", "Error while starting scanning: "+e.getMessage()); } } @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub Log.d("RangingService", "Entering onBind"); return null; }

Служба уже в моем манифесте также. Спасибо за вашу помощь.

+0

Почему вы не используете методы 'onStartCommand()' и 'onBind()'? Как вы начинаете сервис и привязываетесь к нему? – Alberto

+0

@Alberto Я запускаю службу из 'onCreate()' моего основного действия с помощью 'startService()'. Я не использую 'onBind()' или 'onStartCommand()', потому что примеры, которые я нашел, не используют их, и мой код основан на них. –

ответ

2

Пару моментов:

  1. код означает, что вы используете версию 0.X Андроида IBeacon библиотеки. Если вы начинаете новый проект, я настоятельно рекомендую вам использовать Android Beacon Library 2.0, поскольку более ранняя библиотека больше не поддерживается, и теперь трудно найти документацию для нее.

  2. Независимо от используемой вами версии библиотеки, вы должны иметь возможность получить обратный вызов к методу onBeaconServiceConnect() после того, как вы привяжетесь к BeaconManager. Тот факт, что вы не получите этот обратный вызов, вероятно, указывает на то, что BeaconService не запускается должным образом.

Наиболее вероятной причиной того, что BeaconService не запускается должным образом, потому что это не правильно заявлено в манифесте. Если вы используете Eclipse, вы должны отредактировать файл project.properties и добавить строку: manifestmerger.enabled=true. Если вы используете AndroidStudio, это необязательно. Если вы используете IntelliJ, вам может потребоваться объявить услугу вручную.

Вы можете проверить, есть ли у манифеста соответствующие записи, просмотрев сгенерированный файл манифеста в bin/AndroidManifest.xml и проверив, что у него есть запись для BeaconService.

0

У меня были подобные проблемы. Got решена, выполнив следующие действия

  1. В затмение project.properties добавлено manifestmerger.enabled = верно

  2. перезапущен затмение

  3. неустановленной другие приложения радиомаяков в моем андроида телефона и перезагрузки телефона

Смежные вопросы