使用Kontakt.io beacons

时间:2015-05-25 08:15:33

标签: ibeacon-android

我真的需要了解如何启动服务以便扫描信标,即使应用程序在后台运行,我看了一下我在Github上找到的管理员应用程序,但我无法理解它是如何工作的。有没有人有一段简单的代码向我展示它是如何工作的?

我尝试过的一个简单的解决方案(在网上找到)如下:

public class BeaconRangingService extends Service {

        private static final String TAG = BeaconRangingService.class.getSimpleName();
        private BeaconManager beaconManager;

        @Override
        public void onCreate() {
            super.onCreate();
            beaconManager = BeaconManager.newInstance(getApplicationContext());
            beaconManager.setMonitorPeriod(MonitorPeriod.MINIMAL);
            beaconManager.setForceScanConfiguration(ForceScanConfiguration.DEFAULT);
            beaconManager.registerMonitoringListener(new BeaconManager.MonitoringListener() {
                @Override
                public void onMonitorStart() {
                    Log.v(TAG, "start monitoring beacons");
                }

                @Override
                public void onMonitorStop() {
                    Log.wtf(TAG, "stop monitoring beacons");
                }

                @Override
                public void onBeaconsUpdated(Region region, List<Beacon> list) {

                }

                @Override
                public void onBeaconAppeared(Region region, Beacon beacon) {
                   Toast.makeText(getApplicationContext(), "Beacon appeared\n BEACON ID: " + beacon.getBeaconUniqueId(), Toast.LENGTH_SHORT).show();
                }

                @Override
                public void onRegionEntered(Region region) {

                }

                @Override
                public void onRegionAbandoned(Region region) {

                }
            });

        }

        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {

            Log.v(TAG, "service started");

            if (!beaconManager.isBluetoothEnabled()) {
                Log.w(TAG, "bluetooth disabled, stop service");
                stopSelf();
            } else {
                connect();
            }

            return super.onStartCommand(intent, flags, startId);
        }

        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }

        @Override
        public void onDestroy() {
            Log.v(TAG, "service destroyed");
            beaconManager.stopMonitoring();
            beaconManager.disconnect();
            beaconManager = null;
            super.onDestroy();
        }

        private void connectBeaconManager() {
            try {
                beaconManager.connect(new OnServiceBoundListener() {
                    @Override
                    public void onServiceBound() {
                        try {
                            HashSet<Region> regions = new HashSet<>();
                            regions.add(Region.EVERYWHERE);
                            beaconManager.startMonitoring(regions);
                        } catch (RemoteException e) {
                            e.printStackTrace();
                        }
                    }
                });
            } catch (RemoteException e) {
                throw new IllegalStateException(e);
            }
        }

    }     

但我无法让它发挥作用

2 个答案:

答案 0 :(得分:6)

我假设你一直在测试kontakt-beacon-admin-sample-app - 前景/背景展示。该机制非常简单,但需要了解如何在Android中拦截广播。

让我们分析BackgroundScanService

首先BeaconManager负责通过回调方式通知BLE远程设备。

其次BeaconManager是在后台服务中故意配置和控制的,因为服务充当广播生成器。该服务的主要优点是即使用户放弃应用程序也能正常工作。 所以实际上,服务部门盲目地发送广播,希望有人会拦截广播。

第三,请求发送在以下行中执行:

    sendOrderedBroadcast(intent, null);

sendOrderedBroadcast() is documented here.

第四,现在是时候拦截广播了。然后我们配置2个广播接收器:BackgroundScanReceiverForegroundScanReceiver

当拦截扫描广播时,BackgroundScanReceiver会显示通知。

ForegroundScanReceiver只显示祝酒词,但可以根据需要进行更改。

此时有一个技巧,我们指定截取广播的顺序。我们将ForegroundScanReceiver配置为拦截第一顺序中的任何广播。 我们通过在Intent过滤器中设置优先级来设置我们在onResume()中动态注册的Receiver(see SCAN_INTENT_FILTER)(应用程序变为可见)和onPause()(应用程序变得部分可见)。我们还静态配置BackgroundBroadcastReceivergive it the priority with value 1

切换前景/背景

我们现在已确定优先级,并且我们知道ForegroundScanReceiver首先拦截广播,因为它具有更高的优先级。

当应用程序处于前台时,两个扫描接收器(前景和后台)都被注册,但只有前一个接收广播并阻止每个广播被后台拦截。它是done by the following method - abortBroadcast()(注意Foreground和Background接收器扩展了常见的抽象):

   abortBroadcast();

然而,当应用程序隐藏在后台时,ForegroundScanReceiver将取消注册(see onPause() method),因此原始接收器就是BackgroundScanReceiver。

You can find the documentation about abortBroadcast() here.

为什么kontakt.io Proximity SDK中不包含此功能?

kontakt-beacon-admin-sample-app中提出的方法可以通过不同的方式解决,而kontakt.io移动SDK的目标是不向您提供已经实现的所有功能,因为这会产生一些限制适用于您应用的SDK。目标是为您提供基础知识,并提供SDK组件使用方面的灵活性。 kontakt-beacon-admin-sample-app证明了我们的SDK与一些不同的Android组件协作可以为您提供您期望的功能,最重要的是,为您提供您想要做的灵活性

我建议观察kontakt-beacon-admin-sample-app,因为这是第一个将kontakt.io SDK与其他开源库和核心Android SDK集成的不同方法首先引入的项目。

一旦您希望SDK按照您的期望行事,我也强烈建议您提出问题。

我希望我对你的问题作了一些澄清。

答案 1 :(得分:3)

如果您愿意尝试使用免费和开源Android Beacon Library,那么您可以尝试启动应用程序并在后台发现信标时发送通知。它可以在这里找到:

https://github.com/AltBeacon/android-beacon-library-reference

您可以通过添加如here.所述的Beacon Parser

来使用Kontakt.io信标。

此参考应用程序的工作原理是自动启动BeaconService以在手机开机时扫描信标。此服务在后台使用RegionBootstrap类,该类用于自定义AndroidApplicationhere(您可以自定义)。这堂课&#39;首次发现信标时会调用didEnterRegion方法,允许您启动Activity(该示例在首次检测时执行)或发送通知(示例在后续通知中执行此操作。)

有关于此库的所有工作方式的更多文档herehere.