Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android AltBeacon Antecedentes

Estoy trabajando en una aplicación bluetooth usando la biblioteca AltBeacon. Parece que sólo por instancia del BeaconManager se permite por aplicación. El problema que estoy enfrentando es el siguiente: Quiero un servicio continuamente en ejecución de fondo que constantemente hace bluetooth que va y envía notificaciones. Si abro mi aplicación (llevarla al primer plano) era el servicio de pausa que van. La actividad de primer plano hará entonces variar y mostrar contenido en la pantalla.

El problema es que el administrador de beacons (de BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this); ) en la actividad y el servicio es la misma instancia. Así que cuando la actividad se cierra, beaconManager.unbind(this); Se llama y el notificador de rango en el servicio ya no se dispara.

¿Es posible obtener dos instancias separadas de beacon manager? Si no, ¿cómo puedo hacer en un servicio continuo de funcionamiento y una actividad?

RangingActivity

 @Override protected void onCreate(Bundle savedInstanceState) { ... regionEstimote = new Region("estimote", null, null, null); 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(); notificationManager.cancel(NOTIFICATION_ID); //beaconManager.unbind(this); } @Override public void onBeaconServiceConnect() { beaconManager.setRangeNotifier(new RangeNotifier() { .... }); try { beaconManager.startRangingBeaconsInRegion(regionEstimote); } catch (RemoteException e) { Log.e(TAG, "RangingActivity", e); } } 

BeaconService.java

 @Override public int onStartCommand(Intent intent, int flags, int startId) { if(beaconHistory == null) beaconHistory = new HashMap<Integer, Date>(); mBeaconManager = BeaconManager.getInstanceForApplication(this); mBeaconManager.getBeaconParsers().add(new BeaconParser(). setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24")); return START_STICKY; } @Override public void onDestroy() { super.onDestroy(); beaconHistory = null; mBeaconManager.unbind(this); } @Override public void onBeaconServiceConnect() { mBeaconManager.setRangeNotifier(new RangeNotifier() { @Override public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) { if(ActivityBase.isActivityVisible()) { //don't do ranging logic if any activity from my app is in the foreground return; } ... } }); try { mBeaconManager.startRangingBeaconsInRegion(regionMint); } catch (RemoteException e) { Log.e(TAG, "BeaconService", e); } } 

2 Solutions collect form web for “Android AltBeacon Antecedentes”

Este es un caso en el que una clase personalizada android.app.Application es muy útil. El BeaconManager es un singleton, por lo que sólo uno puede existir al mismo tiempo. De manera similar, la clase Application tiene una sola instancia por aplicación Android activa. Si desea realizar la detección de baliza en una Activity y un Service simultáneamente, utilice la clase de Application centralizada para realizar el enlace a BeaconManager y, a continuación, reenvíe las devoluciones de llamada a su Activity y su Service .

Puede ver un ejemplo de vinculación a BeaconManager en una clase de Application y, a continuación, pasar llamadas de retorno a una Activity en la aplicación de referencia aquí: https://github.com/AltBeacon/android-beacon-library-reference/blob/master/app /src/main/java/org/altbeacon/beaconreference/BeaconReferenceApplication.java

Debe extender la clase Applicaton y iniciar la supervisión de fondo de la región tal y como se explica aquí (consulte "Inicio de una aplicación en segundo plano").

Con el fin de hacer el rango, en la misma clase implementar RangeNotifier:

 public class AndroidApp extends Application implements BootstrapNotifier, RangeNotifier {... 

Inicie el rango en didEnterRegion:

 @Override public void didEnterRegion(Region region) { try { mBeaconManager.startRangingBeaconsInRegion(region); } catch (RemoteException e) { if (BuildConfig.DEBUG) Log.d(Const.TAG, "Can't start ranging"); } } 
  1. Implementar el método didRangeBeaconsInRegion:

     @Override public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) { if (beacons.size() > 0) { Beacon firstBeacon = beacons.iterator().next(); if (BuildConfig.DEBUG) Log.d(Const.TAG, "Beacon ranged: UUID: " + firstBeacon.getId1().toString() + " Major: " + firstBeacon.getId2().toString() + " Minor: " + firstBeacon.getId3().toString()); // Do something with the result // Stop ranging try { mBeaconManager.stopRangingBeaconsInRegion(region); } catch (RemoteException e) { e.printStackTrace(); } } } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.