我有一个应用程序,我想扫描附近的信标并获取其RSSI,UUID,主要和次要信息。为了测试我的代码,我曾经在另一台设备上使用Beacon Simulator应用程序制作了虚拟信标。我检查了几种方法,但都无法正常工作:
1)在这段代码中,我制作了一个扫描程序类,并在片段中开始扫描并获取地址(我认为这是BLE设备的mac地址)和RSSI,但是当我想获取UUID时,它说它为空>
private val mLeScanCallback = BluetoothAdapter.LeScanCallback { device, rssi, scanRecord ->
if (rssi > signalStrength) {
mHandler.post{
val uuid : String
if(device.uuids != null){
uuid = device.uuids[0].uuid.toString()
}
else{
uuid = "nullll"
scanRecord
}
Log.i("scan" , "device founded -> address:" + device.address + " name: " + device.name +" uuid: " + uuid + " RSSI: " + rssi + " type: " + device.type)
}
}
}
并在我的片段中调用此函数进行扫描:
private fun scanLeDevice(enable: Boolean) {
if (enable && !isScanning) {
Log.i("scan" , "starting scan ...")
// Stops scanning after a pre-defined scan period.
mHandler.postDelayed({
Log.i("scan" , "stopping scan ...")
isScanning = false
mBluetoothAdapter.stopLeScan(mLeScanCallback)
stopScan()
}, scanPeriod)
isScanning = true
mBluetoothAdapter.startLeScan(mLeScanCallback)
} else {
isScanning = false
mBluetoothAdapter.stopLeScan(mLeScanCallback)
}
}
2)我检查的第二种方法是在片段中使用此功能,但是什么也没发生,也没有检测到信标:
private val beaconManager = BeaconManager.getInstanceForApplication(MainApplication.applicationContext())
override fun onBeaconServiceConnect() {
beaconManager.removeAllRangeNotifiers()
beaconManager.addRangeNotifier(object : RangeNotifier {
override fun didRangeBeaconsInRegion(beacons: Collection<Beacon>, region: Region) {
if (beacons.size > 0) {
Log.i(TAG, "The first beacon I see is about " + beacons.iterator().next().getDistance() + " meters away.")
}
}
})
try {
beaconManager.startRangingBeaconsInRegion(Region("myRangingUniqueId", null, null, null))
} catch (e: RemoteException) {
}
}
我真的不知道怎么了...
答案 0 :(得分:0)
对于使用Android Beacon库的第二个列表,问题在于您永远不会调用beaconManager.bind(this)
,因此,您永远不会得到对onBeaconServiceConnect
的回调,并且该方法中的任何代码都不会执行
由于您使用的是片段而不是活动,因此请务必实际实现BeaconConsumer
的 all 方法,带有onBeaconServiceConnect
方法的类必须实现。有关该链接的更多信息,请参见here。
最后,如果您正在寻找iBeacon发射机,则必须设置信标布局。执行此操作的Java代码是beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));