You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 01:48:08