Android BluetoothLeScanner startScan无法在Android 7+;备用模式

Android BluetoothLeScanner startScan无法在Android 7+;备用模式,android,Android,我开发了一款android应用程序,每15分钟扫描一次蓝牙设备,持续15秒。我希望我的schedulejob每15分钟触发一次(android 7+允许的最短时间),获取最近的地理位置,扫描15秒,然后将具有特定地理位置的设备列表发送到我的后端。即使手机处于待机状态,也应运行此过程 我在流程的每个步骤中都添加了日志记录,以查看实际触发了什么,没有触发什么。我的scheduleJob实际上按预期每15分钟运行一次,但是没有扫描可扩展设备。没有显示错误消息,但我可以清楚地看到扫描过程没有运行 为了设

我开发了一款android应用程序,每15分钟扫描一次蓝牙设备,持续15秒。我希望我的schedulejob每15分钟触发一次(android 7+允许的最短时间),获取最近的地理位置,扫描15秒,然后将具有特定地理位置的设备列表发送到我的后端。即使手机处于待机状态,也应运行此过程

我在流程的每个步骤中都添加了日志记录,以查看实际触发了什么,没有触发什么。我的scheduleJob实际上按预期每15分钟运行一次,但是没有扫描可扩展设备。没有显示错误消息,但我可以清楚地看到扫描过程没有运行

为了设置一些测试,我添加了一个手动触发器来扫描设备并运行整个过程,当我这样做时,一切都按预期进行。因此,我想我可以声明我的设置以确认权限已正确完成,并且我的location helper类工作正常(我在schedulejob过程中也确认了这一点,我已成功获得一个好位置)。我可以确认手机上的蓝牙系统工作正常,因为手动触发器确实找到了我的设备

所以看起来startScan并不像我在schedulejob期间预期的那样运行。我已经在安卓6、安卓7和安卓10上进行了测试,在安卓6上,即使在待机模式下,扫描似乎也能像预期的那样工作,从安卓7开始,它不再在待机模式下工作。 当用户打开并激活应用程序15分钟时,android 10上的startscan似乎会触发

对于scheduleJob,我调用以下方法:

public void scheduleJob(){
ComponentName ComponentName=新的ComponentName(这是AppService.class);
JobInfo=new JobInfo.Builder(123,组件名称)
.setRequiredNetworkType(JobInfo.NETWORK\u TYPE\u ANY)
.setPersisted(true)
//1000*60*2.5=>2.5分钟=>Android将自动将此更改为允许的最小=>15分钟
.setPeriodic(2500*60)
.build();
}
对于我的权限,我有以下权限:


至于我的STARTESCAN功能,我可以确认它正在被触发


私有void init(){
if(mMapBleScanCallback==null){
mMapBleScanCallback=新的ConcurrentSkipListMap();
}
if(mHandler==null){
mHandler=新处理程序();
}
if(mBluetoothAdapter==null){
mBluetoothAdapter=BluetoothAdapter.getDefaultAdapter();
}
if(mBluetoothLeScanner==null){
mBluetoothLeScanner=mBluetoothAdapter.getBluetoothLeScanner();
}
if(mScanSettingsBuilder==null){
mScanSettingsBuilder=新的扫描设置.Builder();
mScanSettingsBuilder.setScanMode(ScanSettings.SCAN_MODE_BALANCED);
}
}
公共网络(ESCAN){
Log.d(标签“Startedscan”);
if(mBluetoothLeScanner==null){
mBluetoothLeScanner=mBluetoothAdapter.getBluetoothLeScanner();
}
if(mBluetoothLeScanner!=null&!扫描错误){
错误扫描=正确;
notifyCallback(Constants.BLE.CALLBACK\u SCAN\u START,null);
//mBluetoothLeScanner.startScan(getScanFilters(),mScanSettingsBuilder.build(),mScanCallback);
//我已将筛选器设置为空
//我的扫描设置设置为scansettings.SCAN\u MODE\u在初始化期间平衡
mbluetotherscanner.startScan(null,mScanSettingsBuilder.build(),mScanCallback);//我已将筛选器设置为null
mHandler.postDelayed(新的Runnable(){
@凌驾
公开募捐{
stopLeScan();
}
},常数。表。扫描周期);
}
}
至于我的回调,我在检测到设备时添加了日志记录。我可以在手动扫描期间的日志中看到找到了设备,但在schedulejob期间没有,没有显示任何设备

private ScanCallback mScanCallback=new ScanCallback(){
@凌驾
公共void onScanResult(int callbackType、ScanResult){
Log.d(标记“onScanResult:+result.toString());
super.onScanResult(回调类型、结果);
准备扫描结果(结果);
}
@凌驾
公共无效OnScan失败(内部错误代码){
super.onscan失败(错误代码);
Log.d(标签“onScanFailed:errorcode:”+errorcode);
}
};
以下是一些日志记录的图像:

我发现(参考第1点),其中提到三星安卓7+手机不允许在没有至少1个扫描过滤器的情况下进行扫描。事实上,在实现了至少一个扫描过滤器之后,一切都开始正常工作