多个信标使用者,并且信标未使用AltBeacon进行检测

问题描述

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

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

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

 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,i:4-20v
 D/BeaconParser: Parsing beacon layout: m:2-3=0215,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

这是我正在使用的课程

class BeaconsDataSource(private val context: Context) : BeaconConsumer,RangeNotifier,MonitorNotifier {

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

    private val region = Region("myRegion",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,d:25-25"))
        beaconManager.beaconParsers
                .add(BeaconParser().setBeaconLayout("x,d:12-15"))
        beaconManager.beaconParsers
                .add(BeaconParser().setBeaconLayout("s:0-1=feaa,i:14-19"))
        beaconManager.beaconParsers.add(BeaconParser().setBeaconLayout("s:0-1=feaa,i:4-20v"))
        beaconManager.beaconParsers
                .add(BeaconParser().setBeaconLayout("m:2-3=0215,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类

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

解决方法

很难说是什么导致了多重绑定操作,但这很可能导致了检测问题。我怀疑这与LiveData生命周期有关。不幸的是,调试(对我来说)要查看代码片段要花更多的时间。

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

我确实创建了一个有效的Kotlin示例应用here,以防对您有所帮助。此示例演示如何使用MutableLiveData共享来自对您的Activity进行检测的中心类的信标检测数据。在这种情况下,中心类是Android应用程序类,但它也可以是任何具有较长生命周期的单例。关键是它在启动时会调用bind(...)一次,直到您完成信标处理后才会再次调用它。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...