How to range beacons in background using Altbeacon: Android Beacon Library?

后端 未结 1 1103
野趣味
野趣味 2020-12-20 07:33

I\'m developing an app which provides background Beacon monitoring. I would like to start ranging when user enters beacon from defined region. When app is in background and

相关标签:
1条回答
  • 2020-12-20 07:41

    I finally figured it out how to do this! Actually I was quite simple and I was doing it right from the begining but by a mistake I'v been using old version of Altbeacon library and that caused all my problems... Ehh

    Never mind. Here is my code. Meybe someone could use it ;) I made it by creating centralized Application class which implements BootstrapNotifier for background notifications when entering defined Region. My class also implements interfaces BeaconConsumer, RangeNotifier which are necessery to do beacon ranging.

    package com.smartmachi.smartmachi_android;
    import android.app.Application;
    import android.app.NotificationManager;
    import android.app.PendingIntent;
    import android.app.TaskStackBuilder;
    import android.content.Context;
    import android.content.Intent;
    import android.os.RemoteException;
    import android.support.v4.app.NotificationCompat;
    import android.util.Log;
    
    import org.altbeacon.beacon.Beacon;
    import org.altbeacon.beacon.BeaconConsumer;
    import org.altbeacon.beacon.BeaconManager;
    import org.altbeacon.beacon.BeaconParser;
    import org.altbeacon.beacon.Identifier;
    import org.altbeacon.beacon.RangeNotifier;
    import org.altbeacon.beacon.Region;
    import org.altbeacon.beacon.powersave.BackgroundPowerSaver;
    import org.altbeacon.beacon.startup.BootstrapNotifier;
    import org.altbeacon.beacon.startup.RegionBootstrap;
    
    import java.util.Collection;
    
    public class BeaconReferenceApplication extends Application implements BootstrapNotifier, BeaconConsumer, RangeNotifier {
        private static final String TAG = "BeaconReferenceApp";
        private RegionBootstrap regionBootstrap;
        private BackgroundPowerSaver backgroundPowerSaver;
        private MainActivity rangingActivity = null;
        BeaconManager beaconManager;
    
    
        public void onCreate() {
            super.onCreate();
            beaconManager = BeaconManager.getInstanceForApplication(this);
            beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("s:0-1=feaa,m:2-2=00,p:3-3:-41,i:4-13,i:14-19"));
    
            Region region = new Region("backgroundRegion", Identifier.parse("0xf7826da6bc5b71e0893e"), null, null);
            regionBootstrap = new RegionBootstrap(this, region);
    
            backgroundPowerSaver = new BackgroundPowerSaver(this);
    
            beaconManager.setBackgroundBetweenScanPeriod(30000l);
            beaconManager.setForegroundBetweenScanPeriod(2000l);
            beaconManager.bind(this);
        }
    
        @Override
        public void didEnterRegion(Region region) {
            Log.d(TAG, "did enter region.");
            try {
                beaconManager.startRangingBeaconsInRegion(region);
            }
            catch (RemoteException e) {
                if (BuildConfig.DEBUG) Log.d(TAG, "Can't start ranging");
            }
        }
    
        @Override
        public void didExitRegion(Region region) {
            try {
                beaconManager.stopRangingBeaconsInRegion(region);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
    
        @Override
        public void didDetermineStateForRegion(int state, Region region) {
            Log.d(TAG,"I have just switched from seeing/not seeing beacons: " + state);
        }
    
        private void sendNotification(String text) {
            NotificationCompat.Builder builder =
                    new NotificationCompat.Builder(this)
                            .setContentTitle("Beacon Reference Application")
                            .setContentText(text)
                            .setSmallIcon(R.drawable.ic_launcher);
    
            TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
            stackBuilder.addNextIntent(new Intent(this, MainActivity.class));
            PendingIntent resultPendingIntent =
                    stackBuilder.getPendingIntent(
                            0,
                            PendingIntent.FLAG_UPDATE_CURRENT
                    );
            builder.setContentIntent(resultPendingIntent);
            NotificationManager notificationManager =
                    (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
            notificationManager.notify(1, builder.build());
        }
    
        @Override
        public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
            if (beacons.size() > 0) {
                for (Beacon b : beacons) {
                    if(b.getId2().toString().equals("0x6d767674636e")) {
                        Log.e(TAG, "Beacon with my Instance ID found!");
                        sendNotification("Beacon with my Instance ID found!");
                    }
                }
            }
        }
    
        @Override
        public void onBeaconServiceConnect() {
            beaconManager.setRangeNotifier(this);
        }
    }
    
    0 讨论(0)
提交回复
热议问题