首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用AltBeacon未检测到多个信标使用者和信标

使用AltBeacon未检测到多个信标使用者和信标
EN

Stack Overflow用户
提问于 2020-08-22 02:00:27
回答 1查看 124关注 0票数 0

我在我的一个android项目中使用了altbeacon库。在该项目中,已经在其中一个活动中实现了BeaconConsumer。当我尝试在我的代码部分实现信标检测时,信标没有检测到。

但是,当我从以前编写的代码中删除BeaconConsumer代码时,我的代码可以正常工作并检测到信标。

这是信标未检测到时的日志。为什么有多个消费者,这是问题所在吗?如果是这样,如何删除多个消费者。

代码语言:javascript
运行
复制
 I/System.out: ---------onBeaconServiceConnect
 D/BeaconParser: Parsing beacon layout: m:2-3=beac,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25
 D/BeaconParser: Parsing beacon layout: x,s:0-1=feaa,m:2-2=20,d:3-3,d:4-5,d:6-7,d:8-11,d:12-15
 D/BeaconParser: Parsing beacon layout: s:0-1=feaa,m:2-2=00,p:3-3:-41,i:4-13,i:14-19
 D/BeaconParser: Parsing beacon layout: s:0-1=feaa,m:2-2=10,p:3-3:-41,i:4-20v
 D/BeaconParser: Parsing beacon layout: m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24
 D/BeaconLocalBroadcastProcessor: Register calls: global=6 instance=6
 D/BeaconLocalBroadcastProcessor: Register calls: global=7 instance=7
 D/BeaconManager: consumer count is now: 2
 D/BeaconManager: This consumer is not bound.  Binding now: MainActivity@11b9235
 D/BeaconManager: Not starting beacon scanning service. Using scheduled jobs
 D/BeaconLocalBroadcastProcessor: Register calls: global=8 instance=8
 D/BeaconManager: consumer count is now: 3
 D/BeaconManager: Unbinding
 D/BeaconManager: Not unbinding from scanning service as we are using scan jobs.
 D/BeaconManager: Before unbind, consumer count is 3
 D/BeaconManager: After unbind, consumer count is 2

这就是我正在使用的类

代码语言:javascript
运行
复制
class BeaconsDataSource(private val context: Context) : BeaconConsumer, RangeNotifier,MonitorNotifier {

    private val beaconManager: BeaconManager =
            BeaconManager.getInstanceForApplication(context)

    private val region = Region("myRegion", null, null, null)

    private lateinit var data: Step
    private var listener: ((Step) -> Unit)? = null
    override fun getApplicationContext(): Context = context

    override fun unbindService(p0: ServiceConnection?) {
        applicationContext.unbindService(p0!!)
    }

    override fun bindService(p0: Intent?, p1: ServiceConnection?, p2: Int): Boolean {
        
        return applicationContext.bindService(p0, p1!!, p2)
    }

    override fun onBeaconServiceConnect() {
        BeaconManager.setDebug(true)
        beaconManager.beaconParsers
                .add(BeaconParser().setBeaconLayout("m:2-3=beac,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25"))
        beaconManager.beaconParsers
                .add(BeaconParser().setBeaconLayout("x,s:0-1=feaa,m:2-2=20,d:3-3,d:4-5,d:6-7,d:8-11,d:12-15"))
        beaconManager.beaconParsers
                .add(BeaconParser().setBeaconLayout("s:0-1=feaa,m:2-2=00,p:3-3:-41,i:4-13,i:14-19"))
        beaconManager.beaconParsers.add(BeaconParser().setBeaconLayout("s:0-1=feaa,m:2-2=10,p:3-3:-41,i:4-20v"))
        beaconManager.beaconParsers
                .add(BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"))


        beaconManager.removeAllMonitorNotifiers()
        beaconManager.removeAllRangeNotifiers()

        beaconManager.addMonitorNotifier(this)
        beaconManager.addRangeNotifier(this)

        try {
            beaconManager.startMonitoringBeaconsInRegion(region)
            beaconManager.startRangingBeaconsInRegion(region)
        } catch (e: RemoteException) {
            e.printStackTrace()
        }

    }

    override fun didRangeBeaconsInRegion(p0: MutableCollection<Beacon>, p1: Region?) {
      
            data = Step.ENTER_NUMBER
            notifyListeners()

    }

    private fun notifyListeners() {
        listener?.invoke(data)
    }


    fun requestBeaconsUpdate(listener: (Step) -> Unit) {
        this.listener = listener
        beaconManager.bind(this)
    }

    fun stopBeaconsUpdate() {       
        beaconManager.unbind(this)
    }

    override fun didDetermineStateForRegion(p0: Int, p1: Region?) {
        val msg = "---------did determine state for region $p0"
        Log.d("TAG", msg)
    }


    override fun didEnterRegion(p0: Region?) {
        val msg = "-----------did enter region"
        val zone = p0.toString()
        Log.d("TAG", "----------Enter in region")
        val text = "Enter in $zone"
        Log.d("TAG", msg)
    }

    override fun didExitRegion(p0: Region?) {
        val msg = "------------did exit region"
        Log.d("TAG", msg)
    }

}

这是我从viewmodel调用的livedata类

代码语言:javascript
运行
复制
class BeaconsLiveData() : LiveData<Step>() {

    private val beaconDataSource = BeaconsDataSource(App.getAppContext())

    private val listener = { data: Step ->
        value = data
      
    }

    override fun onActive() {
        super.onActive()
        beaconDataSource.requestBeaconsUpdate(listener)
    }

    override fun onInactive() {
        super.onInactive()
        beaconDataSource.stopBeaconsUpdate()
    }
} 
EN

回答 1

Stack Overflow用户

发布于 2020-08-22 23:27:58

很难说是什么导致了多重绑定操作,但这很可能是导致检测问题的原因。我怀疑这与LiveData的生命周期有关。不幸的是,(对我来说)调试这个代码片段要比可能的复杂得多。

通常,您应该将系统设计为不频繁地调用beaconManager.bind(...).unbind(...)。这样做经常会导致问题,因为它将启动和停止服务,这是一个重量级机制。

我确实创建了一个可用的Kotlin示例应用程序here,以防对您有帮助。此示例演示了如何使用MutableLiveData共享来自对您的活动进行检测的中心类的信标检测数据。本例中的中心类是Android应用程序类,但它也可以是生命周期较长的任何单例。关键是它在启动时调用一次bind(...),并且在您使用完信标之前不会再次调用它。

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

https://stackoverflow.com/questions/63527886

复制
相关文章

相似问题

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