【问题标题】:Scan beacons not working with Android N device扫描信标不适用于 Android N 设备
【发布时间】:2017-06-02 18:46:43
【问题描述】:

我正在使用 Android N 设备(第 5 代 Moto G)测试一个应用程序,但它没有找到任何信标(beacons.size() == 0 始终),但使用具有较低 API 的其他设备可以正常工作.. . 仅在此设备上失败。

我检查了扫描限制比 Google 在 Android N 中添加的限制:

我们从 DP4 开始更改了 BLE 扫描行为。我们会阻止 应用程序在 30 次中启动和停止扫描超过 5 次 秒。对于长时间运行的扫描,我们会将它们转换为机会性扫描 扫描。

这是代码:

 public void startBeaconScan() {

        Log.d(TAG, "App started up");

        beaconManager = BeaconManager.getInstanceForApplication(this);
        beaconManager.getBeaconParsers().add(new BeaconParser().
                setBeaconLayout(iBeaconLayout));

        long timeBetweenScans = 1100;
        long timeScanPeriod = 500;
        if(Build.VERSION.SDK_INT > 23){ //CHECK IF NOUGAT OR MORE
            timeBetweenScans = 5000;
            timeScanPeriod = 15000;
        }

        beaconManager.setForegroundBetweenScanPeriod(timeBetweenScans);
        beaconManager.setForegroundScanPeriod(timeScanPeriod);
        beaconManager.setBackgroundBetweenScanPeriod(timeBetweenScans);
        beaconManager.setBackgroundScanPeriod(timeScanPeriod);

        beaconManager.setRegionStatePeristenceEnabled(true);    
        region = new Region("myMonitoringUniqueId", Identifier.parse("2f234454-cf6d-4a0f-adf2-f4911ba9ffa6"), null, null);
        new RegionBootstrap(this, region);
    }

此函数是从 BootstrapNotifier 接口的应用程序的 didDetermineStateForRegion() 回调方法调用的。

知道我为什么会遇到这个问题吗?在 Android N 上,我只用 Moto G 5th 进行了测试……但在其他设备(Android L、Android M……)上,代码运行良好。

----- 更新 -----

应用程序启动的Logcat:

06-01 15:51:05.183 12251-12251/? D/MyApplication: App started up
06-01 15:51:05.187 12251-12251/? D/BeaconParser: Parsing beacon layout: m:2-3=beac,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25
06-01 15:51:05.189 12251-12251/? D/BeaconParser: Parsing beacon layout: m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25
06-01 15:51:05.200 21464-4646/? I/PBSessionCacheImpl: Deleted sessionId[4000692901285] from persistence.
06-01 15:51:05.202 21464-4534/? V/ConnectivityManager: isActiveNetworkMetered() returns:false
06-01 15:51:05.207 21464-4534/? V/ConnectivityManager: isActiveNetworkMetered() returns:false
06-01 15:51:05.211 21464-21464/? W/SearchService: Abort, client detached.
06-01 15:51:05.216 21464-5529/? E/ContentStoreEUAS: Failed to commit the deferred actions
06-01 15:51:05.351 12251-12267/? D/NetworkSecurityConfig: No Network Security Config specified, using platform default
06-01 15:51:05.366 12251-12251/? W/BluetoothCrashResolver: Can't read macs from BluetoothCrashResolverState.txt
06-01 15:51:05.371 12251-12251/? W/ModelSpecificDistanceCalculator: Cannot find match for this device.  Using default
06-01 15:51:05.371 12251-12251/? W/ModelSpecificDistanceCalculator: Cannot find match for this device.  Using default
06-01 15:56:17.210 16969-16969/? D/MyApplication: Got a didDetermineStateForRegion call: 2f234454-cf6d-4a0f-adf2-f4911ba9ffa6

【问题讨论】:

  • 您使用的是什么库版本?在扫描开始时捕获包含系统日志的 LogCat 摘录以查看操作系统是否阻止扫描可能会有所帮助。库版本 2.9+ 应该会根据需要自动减慢 Android N 的扫描周期。原因可能不是您想的那样。
  • 我使用的是2.9.2版本,但是如果我不检查版本,logcat上会多次出现此消息:“应用扫描太频繁”。 Beacon 集合的大小始终为 == 0。我用 logcat 的一些消息编辑了帖子。
  • 哇...我发现了问题。这是具有中心角色的设备禁用了位置设置......我的可怕错误。您能否回答解释为什么应该激活位置设置(不仅是清单上的权限)以及是否可以避免?有没有办法在不启用位置设置的情况下使信标扫描工作?

标签: android bluetooth-lowenergy ibeacon-android altbeacon


【解决方案1】:

从 Android Marshmallow (6.0) 开始,必须在设置中打开位置信息才能检测蓝牙 LE 设备。这适用于蓝牙信标以及其他类型的蓝牙 LE 设备。谷歌做出了这一改变,因为扫描蓝牙 LE 设备可能会被用来推断你的位置。同样的限制不适用于 6.0 之前的设备。

一种可能的解决方案是在 6.0+ 设备上@9​​87654321@ 并提示用户将其打开。

值得注意的是,如果您的应用面向 SDK 23+,则还必须获取 android.permission.ACCESS_FINE_LOCATION 或 android.permission.ACCESS_COARSE_LOCATION 的运行时权限。 See here for more info.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    相关资源
    最近更新 更多