首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Kontakt.io信标在Android上找到信标时发送本地通知

使用Kontakt.io信标在Android上找到信标时发送本地通知
EN

Stack Overflow用户
提问于 2015-05-25 08:15:32
回答 2查看 2.4K关注 0票数 1

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

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

代码语言:javascript
复制
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);
            }
        }

    }     

但我不能让它起作用

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-26 11:50:41

我想你已经在测试kontakt-信标-管理-样本-应用程序 -前台/背景展示了。该机制非常简单,但需要对如何在Android中截获广播进行一些了解。

让我们分析一下BackgroundScanService

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

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

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

代码语言:javascript
复制
    sendOrderedBroadcast(intent, null);

这里记录了sendOrderedBroadcast()。

第四,现在是拦截广播的时候了。然后我们配置两个广播接收器来实现这一点:BackgroundScanReceiverForegroundScanReceiver

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

ForegroundScanReceiver简单地显示祝酒词,但这可以根据个人的需要进行更改。

在这一点上,有一个技巧,我们指定应以何种顺序拦截广播。我们将ForegroundScanReceiver配置为以一阶截获任何广播。我们通过设置与接收方(过滤器)绑定的意图筛选器(过滤器)中的优先级,动态地在onResume() (应用程序变得可见)和onPause() (应用程序部分可见)中注册。我们还静态地配置了BackgroundBroadcastReceiver给它以值1的优先级

交换前景/背景

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

当应用程序在前台时,两个扫描接收器(前景和背景)都被注册,但只有前景接收器拦截广播,并防止每个广播被背景广播截获。它是由以下方法完成- abortBroadcast() (请注意,前台和后台接收器扩展了公共抽象):

代码语言:javascript
复制
   abortBroadcast();

然而,当应用程序隐藏在背景中时,则ForegroundScanReceiver未注册(参见onPause()方法),因此原始接收方是BackgroundScanReceiver。

您可以在这里找到关于abortBroadcast()的文档。

为什么这个特性没有包含在kontakt.io邻近SDK中?

kontakt-信标-管理-样本-应用程序中提出的方法可以通过不同的方式解决,而kontakt.io移动SDK的目标是不为您提供已经实现的所有功能,因为这带来了将SDK与应用程序相结合的一些限制。目标是为您提供基本知识,并在SDK组件使用方面提供灵活性。kontakt-信标-管理-样本-应用程序是一个概念的证明,即我们的SDK与一些不同的安卓组件合作可以为您提供您期望的功能,最重要的是给您提供您想要做的事情的灵活性。

我建议观察kontakt-信标-管理-样本-应用程序,因为这是第一个将kontakt.io SDK与其他开源库和核心Android集成的不同方法的项目。

我还强烈鼓励您提出一个问题,一旦您希望SDK按照您的期望行事。

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

票数 6
EN

Stack Overflow用户

发布于 2015-05-25 22:56:07

如果您愿意尝试免费的开源Android灯塔图书馆,那么您可以尝试使用一个现成的参考应用程序来启动该应用程序,并在后台发现信标时发送通知。这里可以买到:

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

您可以通过添加一个灯塔分析器(如所描述的Kontakt.io )来使用这里。信标。

这个参考应用程序的工作原理是自动启动一个BeaconService来扫描手机上的信标。此服务在后台使用RegionBootstrap类,该类用于自定义AndroidApplication这里 (您可以自定义该类)。这个类的didEnterRegion方法在首次发现信标时被调用,允许您启动一个Activity (该示例在第一次检测时这样做)或发送一个通知(该示例在随后的通知中这样做)。

关于这一切如何与 这里 这里。一起工作的更多文档

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30433888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档