2017-06-01 76 views
0

我使用Android N设备(Moto G第5代)测试应用程序,并且始终未找到任何信标(beacons.size()== 0),但与其他具有较低API的设备工作正常......只能在此设备上失败。扫描信标不适用于Android N设备

我检查扫描限制比谷歌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 ...),代码正常工作。

----- ----- UPDATE

的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 
+0

你使用的是什么库版本?当扫描开始查看OS是否阻止扫描时,捕获LogCat摘录(包括系统日志)可能会有所帮助。库版本2.9+会根据Android N的需要自动减慢扫描周期。原因可能与您的想法不同。 – davidgyoung

+0

我使用的是版本2.9.2,但是如果我没有检查版本,这条消息会在logcat上出现好几次:“应用程序扫描得太频繁”。信标集合总是大小为0.我用logcat中的一些消息编辑了帖子。 – adri1992

+0

哇...我发现了这个问题。这是具有中心角色的设备的位置设置被禁用...我可怕的错误。你能否回答解释为什么位置设置(不仅仅是清单上的权限)应该被激活,以及是否可以避免?有没有办法让信标扫描在没有启用位置设置的情况下工作? – adri1992

回答

1

与Android棉花糖(6.0)的位置必须设置以检测接通启动蓝牙LE设备。这适用于蓝牙信标以及其他类型的蓝牙LE设备。谷歌做出了这一改变,因为扫描蓝牙LE设备可能被用来推断你的位置。这种相同的限制不适用于6.0之前的设备。

一个可能的解决方案是在6.0+设备上使用detect if location is off,并提示用户将其打开。

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