簡體   English   中英

多個信標消費者和信標未使用 AltBeacon 進行檢測

[英]Multiple Beacon Consumer and beacon is not detecting using 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,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

這是我正在使用的 class

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

}

這是我從視圖模型調用的實時數據 class

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 示例應用程序,以防對您有所幫助。 此示例演示了如何使用MutableLiveData共享來自中央 class 的信標檢測數據,該中央 class 正在對您的 Activity 進行檢測。 在這種情況下,中央 class 是一個 Android 應用程序 class,但它也可以是任何具有長生命周期的 singleton。 關鍵是它在啟動時調用bind(...)一次,並且在您完成使用信標之前不會再次調用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM