我正在使用带有scanfilters的blescan来检测信标,它在前景和后台运行良好,直至oreo版本,但在android pie方面,它无法在后台发送挂起的广播。
ScanSettings settings = (new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_POWER)).build();
final List<ScanFilter> scanFilters = new ArrayList<>();
scanFilters.add(getScanFilter());
BluetoothAdapter bluetoothAdapter;
final BluetoothManager bluetoothManager =
(BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
bluetoothAdapter = bluetoothManager.getAdapter();
Intent intent = new Intent(this.getApplicationContext(), MyBroadcastReceiver.class);
intent.putExtra("o-scan", true);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
bluetoothAdapter.getBluetoothLeScanner().startScan(scanFilters, settings, pendingIntent);
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
int bleCallbackType = intent.getIntExtra(BluetoothLeScanner.EXTRA_CALLBACK_TYPE, -1);
if (bleCallbackType != -1) {
Log.d(TAG, "Passive background scan callback type: "+bleCallbackType);
ArrayList<ScanResult> scanResults = intent.getParcelableArrayListExtra(
BluetoothLeScanner.EXTRA_LIST_SCAN_RESULT);
// Do something with your ScanResult list here.
// These contain the data of your matching BLE advertising packets
}
}
}
答案 0 :(得分:1)
Android 9引入了一些行为更改,例如限制后台应用访问设备传感器和Wi-Fi扫描。
这些更改会影响在Android 9上运行的所有应用,无论目标SDK版本如何。
使用连续报告模式的传感器(例如加速度计和陀螺仪)不会接收事件。
Android 9在后台限制对传感器的访问:
Android 9限制了后台应用访问用户输入和传感器数据的能力。如果您的应用在运行Android 9的设备上在后台中运行,则系统会对您的应用应用以下限制:
使用连续报告模式的传感器(例如加速度计和陀螺仪)不会接收事件。
使用变更或单次报告模式的传感器不接收事件。
解决方案: 如果您的应用需要在后台运行时检测运行Android 9的设备上的传感器事件,请使用前台服务。
答案 1 :(得分:0)
我是一个使用Oreo(API 26)和上面的代码(略作修改)检测信标的示例Android应用测试。我正在使用Pixel 3 XL(带有Pie)。 我认为,最困难的部分是确定仅使用电池供电时,MyBroadcastReceiver的onRecieve()中的代码是否在检测到信标时实际上正在运行(与Android-studio和Logcat(USB)断开连接) )。
使用Volley(com.android.volley)将HTTP请求提交到本地http服务器,我能够证明它的工作如文档所述-即。当检测到信标时,我能够收到http请求。但是,Volley仅在Android处于唤醒状态或定期唤醒并连接到网络时才发送这些请求-在我的简单测试中,大约每15分钟一次(加上一些变化),但是我确实在我的电脑上获得了所有Beacon ScanResults HTTP服务器,最多延迟15分钟。我什至能够从正在运行的应用程序列表中删除该应用程序(您知道;向上滑动以删除该应用程序),但仍然看到MyBroadcastReceiver中的onRecieve()正在接收BLE ScanResults。
您怎么知道MyBroadcastReceiver中的onRecieve()被杀死了?我很想知道你怎么知道的。