【问题标题】:send local notification when finding a Beacon on Android using Kontakt.io beacons使用 Kontakt.io 信标在 Android 上找到信标时发送本地通知
【发布时间】:2015-05-27 04:29:14
【问题描述】:

即使应用程序在后台运行,我也确实需要了解如何启动服务以扫描信标,我查看了我在 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);
            }
        }

    }     

但我不能让它工作

【问题讨论】:

  • 它应该可以工作。您是否在 Manifest.xml 中声明了服务类?

标签: ibeacon-android


【解决方案1】:

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

我们来分析BackgroundScanService

首先BeaconManager负责通过回调方法通知BLE远程设备的存在。

其次BeaconManager 在后台服务中被有意配置和控制,因为 Service 充当广播生成器。该服务的主要优势在于,即使用户放弃了该应用程序,它也可以工作。 所以实际上Service是盲目的发送广播,希望有人拦截。

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

    sendOrderedBroadcast(intent, null);

sendOrderedBroadcast() is documented here.

第四,现在是拦截广播的时候了。然后我们配置 2 个广播接收器来执行此操作:BackgroundScanReceiverForegroundScanReceiver

BackgroundScanReceiver 在扫描广播被拦截时显示通知。

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

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

切换前景/背景

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

当应用程序处于前台时,两个 Scan 接收器(前台和后台)都已注册,但只有前台接收器会拦截广播并防止每个广播被后台接收器拦截。是done by the following method - abortBroadcast()(注意前台和后台接收器扩展了公共抽象):

   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 的行为符合您的期望,我也强烈建议您提出问题。

我希望我对您的问题有所澄清。

【讨论】:

  • 对不起,我对 kontakt 的 android 信标有最后一个问题,如果您有可能可以在这里查看我的问题吗? stackoverflow.com/questions/30503258/…谢谢
  • 在这种情况下发送通知可以使用服务中的mContext.sendBroadcast(mIntent) 方法解决。
【解决方案2】:

如果您愿意尝试免费和开源的Android Beacon Library,您可以尝试一个可立即运行的参考应用程序,它会在后台发现信标时启动该应用程序并发送通知。可以在这里找到:

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

您可以按照here. 的描述添加 Beacon Parser 来使用 Kontakt.io 信标来实现此功能

此参考应用通过自动启动BeaconService 来在手机开机时扫描信标。该服务在后台使用RegionBootstrap 类在自定义AndroidApplicationhere(您可以自定义)中使用。此类的 didEnterRegion 方法在首次发现信标时被调用,允许您启动 Activity(示例在第一次检测时执行此操作)或发送通知(示例在后续通知中执行此操作。)

关于这一切如何与这个库 herehere. 一起工作的更多文档

【讨论】:

  • 非常喜欢!我会尝试确定您的库,但现在我将使用 Kontakt 库来实现这一点,再次感谢您的帮助 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多