Search code examples
androidibeaconaltbeacon

iBeacons' background ranging with Altbeacon Library


I need to range beacons on the background using Altbeacons library(work properly on foreground mode)

On my android monitor the log never shows the message for the didRangeBeaconsInRegion method.

On the didEnterRegion, the messages are displayed correctly.

I tried the code below but no success, can any one guide me how to do it?

public class INBeaconApplication extends Application implements BootstrapNotifier, RangeNotifier {
private BeaconManager beaconManager;
private ArrayList<INBeacon> userBeaconArrayList;
private INBeaconUser inBeaconUser;

@Override
public void onCreate() {
    super.onCreate();
    Log.d("INBeacon", "Application created");

    //BeaconManager and custom beaconParser layout
    beaconManager = BeaconManager.getInstanceForApplication(this);
    beaconManager.getBeaconParsers().clear();
    beaconManager.getBeaconParsers().add(new BeaconParser()
            .setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));
    beaconManager.setRegionStatePeristenceEnabled(false);

    //Set the BeacomManager background between scan periods
    long period = 1000 * 30; //equal to 30 seconds
    beaconManager.setBackgroundBetweenScanPeriod(period);

    // wake up the app when a beacon is seen
    Region region = new Region(Utils.REGION_ID, Identifier
            .parse(Utils.INBEACON_UUID), null, null);
    new RegionBootstrap(this, region);

    new BackgroundPowerSaver(this);
}



boolean checkPermissionForRange(){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        return getApplicationContext().checkSelfPermission(
                Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED;
    }
    return true;
}

@Override
public void didEnterRegion(Region region) {
    Log.d("INBeacon", "didEnterRegion");
    Utils.sendNotification(this, "Test");
    if (checkPermissionForRange()) return;
    Log.d("INBeacon", "permissions ok");
    try {
        beaconManager.startRangingBeaconsInRegion(region);
        Log.d("INBeacon","startRanging");
    } catch (RemoteException e) {
        Log.e("INBeacon",e.getMessage());
    }
}

@Override
public void didExitRegion(Region region) {
    Log.d("INBeacon", "didExitRegion");
    try {
        beaconManager.stopRangingBeaconsInRegion(region);
    } catch (RemoteException e) {
        e.printStackTrace();
    }
}

@Override
public void didRangeBeaconsInRegion(Collection<Beacon> collection, Region region) {
    Log.d("INBeacon", "didRangeBeaconsInRegion");
    ArrayList<Beacon> newBeacons = new ArrayList<>(collection);
      .............code to do what i need with the beacons.....
}

Solution

  • It looks like the code simply needs to call:

     beaconManager.setRangeNotifier(this);