三星SM-T285安卓5.1.1使用altbeacon2.16.3开启Beacon广播报错求助
问题根因
- 报错的核心原因是三星SM-T285硬件本身不支持BLE广播功能,日志第一行
E/BluetoothAdapter: bluetooth le advertising not supported已经给出明确提示。虽然Android 5.0及以上系统开放了BLE广播API,但不是所有搭载对应版本系统的设备都具备相关硬件能力,很多老款入门级设备只支持BLE扫描,阉割了广播模块。 - 空指针异常是因为设备不支持BLE广播时,系统
BluetoothAdapter.getBluetoothLeAdvertiser()方法会返回null,altbeacon 2.16.3版本的代码没有对这个返回值做非空校验,直接调用startAdvertising方法就触发了崩溃。
解决方案
- 加前置校验避免崩溃
在初始化BeaconTransmitter之前先做兼容性检测,不支持的设备直接给出业务提示,不要走到后续广播逻辑:
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); // 先校验蓝牙是否可用 if (bluetoothAdapter == null || !bluetoothAdapter.isEnabled()) { // 自定义逻辑:提示用户开启蓝牙 return; } // 校验系统版本和BLE广播能力 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { // 自定义逻辑:提示5.0以下系统不支持广播 return; } BluetoothLeAdvertiser advertiser = bluetoothAdapter.getBluetoothLeAdvertiser(); if (advertiser == null) { // 自定义逻辑:提示当前设备不支持Beacon广播 return; } // 校验通过后再执行原来的广播初始化代码 Beacon beacon = new Beacon.Builder() .setId1("2f234454-cf6d-4a0f-adf2-f4911ba9ffa6") .setId2("1") .setId3("2") .setManufacturer(0x0118) .setTxPower(-59) .setDataFields(Arrays.asList(new Long[] {0l})) .build(); BeaconParser beaconParser = new BeaconParser() .setBeaconLayout("m:2-3=beac,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25"); BeaconTransmitter beaconTransmitter = new BeaconTransmitter(getApplicationContext(), beaconParser); beaconTransmitter.startAdvertising(beacon);
- 硬件层面无破解方案
如果业务必须在这款设备上实现Beacon广播功能,没有软件层面的解决方法,只能更换支持BLE广播的设备。 - 库层面兼容(可选)
你也可以修改altbeacon 2.16.3版本的源码,在BeaconTransmitter.startAdvertising方法调用BLE广播接口前增加非空判断,不支持时直接回调错误通知,避免应用崩溃。
内容的提问来源于stack exchange,提问作者Isaias Alves
相关产品推荐
相关产品推荐

