【问题标题】:How to range beacons in background using Altbeacon: Android Beacon Library?如何使用 Altbeacon:Android 信标库在后台定位信标?
【发布时间】:2016-03-17 14:48:44
【问题描述】:

我正在开发一个提供后台 Beacon 监控的应用程序。当用户从定义的区域进入信标时,我想开始测距。当应用程序处于后台并且它一直在监视并且用户进入我定义的区域时,我想开始测距并获取 InstanceID 或主要、次要值以确定是什么信标,连接到服务器并向用户发送通知。最好的情况是我可以在后台与服务器进行范围通信。我使用这个示例来实现后台监控:https://altbeacon.github.io/android-beacon-library/samples.html。我还从这里下载了示例项目:https://github.com/AltBeacon/android-beacon-library-reference 并以此为基础。

不幸的是,在此示例中,当用户进入该区域时,Activity 已启动...我不希望这种情况发生。 Soo 我的问题是:是否可以在后台定位信标?

在我的情况下也发生了奇怪的事情,因为当我将我的应用程序置于后台时,仍然从 MainActivity 调用“didRangeBeaconsInRegion(集合信标,区域区域)”但没有找到信标。由于 beaconManager 处于后台模式,因此方法的调用频率也较低。当我启动没有发生的示例项目时。可能是因为我没有monitoringActivity。我的 MainActivity 在启动时会立即进行测距。当然,我尝试将所有内容设置为与示例 BeaconReferenceApplication 中完全相同。

顺便说一句,我正在使用 Android 6.0.1 的 Nexus 5 上测试我的应用

提前感谢您的任何解决方案!

【问题讨论】:

    标签: android background altbeacon region-ranging


    【解决方案1】:

    我终于想出了如何做到这一点!其实我很简单,我从一开始就是这样做的,但是由于错误我一直在使用旧版本的 Altbeacon 库,这导致了我所有的问题......嗯

    没关系。这是我的代码。 Meybe有人可以使用它;) 我通过创建集中的应用程序类来实现它,该类在进入定义的区域时实现了后台通知的 BootstrapNotifier。我的课程还实现了 BeaconConsumer、RangeNotifier 接口,这些接口是进行信标测距所必需的。

    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);
        }
    }
    

    【讨论】:

    • 嗨@Zibiksior,我检查了你的代码,非常感谢!在您的帮助下,我能够在打开应用程序时进行信标检测。但遗憾的是,如果(使用 Nexus 5 和 5X)应用程序在后台,它就不起作用。问题似乎来自区域声明,在您的代码中为什么要设置“backgroundRegion”? (Eddystone 没有按地区定义,我在官方文档中没有找到这种代码)。谢谢!
    • 这太好了,谢谢!我把它作为一项服务而不是一项活动来做,而且效果很好......我只是几乎没有错过它,无法弄清楚
    • setRangeNotifier 已弃用。见:stackoverflow.com/a/38964752/5897324
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-28
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多