Android Beacon库启用Intent扫描策略后无法检测Beacon的问题求助
我开发的APP目标平台为Android 13,使用最新版Android Beacon库,需求是APP被杀状态下,当自定义Beacon进入范围时显示通知。
由于Job调度策略扫描速度太慢,且不想使用前台服务的持久通知,我尝试通过Intent策略实现后台扫描——调用beaconManager.setIntentScanningStrategyEnabled(true),但调用后APP完全检测不到Beacon;移除该设置后则能正常检测。
Logcat日志(启用Intent扫描后)
2023-05-13 17:17:59.258 17253-17318 MonitoringStatus com.MichalKapuscinski.BikeTPMS D Time to purge inactive regions. 2023-05-13 17:17:59.259 17253-17318 ScanHelper com.MichalKapuscinski.BikeTPMS D Calling ranging callback 2023-05-13 17:17:59.259 17253-17318 Callback com.MichalKapuscinski.BikeTPMS D attempting callback via direct method call 2023-05-13 17:17:59.260 17253-17318 IntentHandler com.MichalKapuscinski.BikeTPMS D got ranging data 2023-05-13 17:17:59.260 17253-17253 MainActivity com.MichalKapuscinski.BikeTPMS D Ranged: 0 beacons 2023-05-13 17:17:59.260 17253-17253 MainActivity com.MichalKapuscinski.BikeTPMS D Ranged: 0 beacons 2023-05-13 17:17:59.304 17253-17270 System com.MichalKapuscinski.BikeTPMS W A resource failed to call close.
日志显示APP在前台时也仅能检测到0个Beacon。
启用Intent扫描后的onCreate()代码
override fun onCreate() { super.onCreate() val beaconManager = BeaconManager.getInstanceForApplication(this) BeaconManager.setDebug(true) // 清除默认的AltBeacon解析器 beaconManager.getBeaconParsers().clear() beaconManager.getBeaconParsers().add( BeaconParser().setBeaconLayout("m:3-4=eaca,i:5-5,i:6-6,i:7-7,p:2-2,d:12-15")) // 启用Intent扫描策略 beaconManager.setIntentScanningStrategyEnabled(true) // 定义匹配所有Beacon的区域 region = Region("all-beacons", null, null, null) beaconManager.startMonitoring(region) beaconManager.startRangingBeacons(region) // wysypuje apke // 通过LiveData监听区域状态和Beacon测距数据 val regionViewModel = BeaconManager.getInstanceForApplication(this).getRegionViewModel(region) regionViewModel.regionState.observeForever( centralMonitoringObserver) regionViewModel.rangedBeacons.observeForever( centralRangingObserver) }
Manifest配置文件
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.BLUETOOTH_SCAN"/> <!-- 仅在需要读取设备名称或建立蓝牙连接时需要 --> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/> <application android:name="BeaconReferenceApplication" android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher" android:supportsRtl="true" android:theme="@style/Theme.MyApplication" tools:targetApi="31"> <activity android:launchMode="singleInstance" android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.MichalKapuscinski.BikeTPMS.beacon.permissions.BeaconScanPermissionsActivity" android:exported="false"/> </application> </manifest>
需完成以下调整,让Intent扫描策略正常工作:
完善蓝牙扫描权限声明:Android 12+中,
BLUETOOTH_SCAN权限需指定用途。由于Beacon扫描属于位置相关场景,修改Manifest中的权限声明:<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />若需通过Beacon获取位置信息,需确保用户已授予
ACCESS_FINE_LOCATION权限。注册广播接收器:Intent扫描策略依赖广播接收器传递扫描结果,在Manifest的
<application>标签内添加:<receiver android:name="org.altbeacon.beacon.BroadcastReceiver" android:exported="false"> <intent-filter> <action android:name="org.altbeacon.beacon.SCAN_RANGING" /> <action android:name="org.altbeacon.beacon.SCAN_MONITORING" /> </intent-filter> </receiver>调整扫描周期参数:显式配置扫描时长和间隔,确保Intent策略下扫描频率符合需求:
beaconManager.setBackgroundScanPeriod(1100) // 单次扫描时长1.1秒 beaconManager.setBackgroundBetweenScanPeriod(0) // 无间隔持续扫描(Intent策略下无需前台服务)确认运行时权限已授予:需在代码中请求
POST_NOTIFICATIONS、ACCESS_FINE_LOCATION、BLUETOOTH_SCAN权限,Android 13的通知权限需用户手动授权。拆分Monitoring和Ranging逻辑:Intent策略下同时启动Monitoring和Ranging可能引发冲突,建议先仅启用Monitoring测试,确认能检测到Beacon后再添加Ranging。
内容的提问来源于stack exchange,提问作者Michal

