Да. В Android 8+ вы можете использовать сканирование по назначению, привязанное к BroadcastReceiver, чтобы активировать приложение, основанное на обнаружении рекламы BLE. BroadcastReceiver будет работать только в течение нескольких секунд, но вы можете использовать это время для немедленного запуска JobService, который может работать до 10 минут. Это именно то, что Библиотека Android Beacon делает «из коробки», чтобы разрешить обнаружение фона. Вы также можете использовать службу переднего плана для работы в фоновом режиме более 10 минут. Подробнее об опциях здесь .
ScanSettings settings = (new ScanSettings.Builder().setScanMode(
ScanSettings.SCAN_MODE_LOW_POWER)).build();
// Make a scan filter matching the beacons I care about
List<ScanFilter> filters = getScanFilters();
BluetoothManager bluetoothManager =
(BluetoothManager) mContext.getApplicationContext()
.getSystemService(Context.BLUETOOTH_SERVICE);
BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter();
Intent intent = new Intent(mContext, MyBroadcastReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
bluetoothAdapter.getBluetoothLeScanner().startScan(filters, settings, pendingIntent);
Приведенный выше код вызовет запуск Intent, который вызовет вызов класса MyBroadcastReceiver при обнаружении соответствующего устройства Bluetooth. Затем вы можете получить данные сканирования следующим образом:
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
}
}
}