如何解决多个信标使用者,并且信标未使用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)
}
}
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(...)
一次,直到您完成信标处理后才会再次调用它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。