Как получить обратный звонок при потере сигнала BLE? - PullRequest
0 голосов
/ 29 мая 2018

У меня есть проблема с проверкой BLE на Android.Я хочу получить подробную информацию о отключении устройства.Я могу получить информацию, используя startScan(filters,settings,leScanCallback); Вот мой код:

BluetoothManager btManager =(BluetoothManager)getSystemService(Context.BLUETOOTH_SERVICE);
BluetoothAdapter btAdapter=btManager.getAdapter();
BluetoothLeScanner btScanner=btAdapter.getBluetoothLeScanner();
ScanFilter filter = new ScanFilter.Builder().setDeviceAddress("E0:E5:CF:32:95:B2").build();
                List<ScanFilter> filters = new ArrayList<>();
                filters.add(filter);
                ScanSettings settings = new ScanSettings.Builder()
                        .setScanMode(ScanSettings.SCAN_MODE_BALANCED)
                        .setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES)
                        .build();
                btScanner.startScan(filters,settings,leScanCallback);

    private ScanCallback leScanCallback = new ScanCallback() {
            @Override
            public void onScanResult(int callbackType, ScanResult result) {

                super.onScanResult(callbackType,result);

                Log.d(ACTIVITY_TAG, String.format("message:%d %s", callbackType,result.getDevice().getAddress()));
            }
   }

Работа, но потерянное сообщение не получено.Я пытался использовать ScanSettings.CALLBACK_TYPE_FIRST_MATCH|ScanSettings.CALLBACK_TYPE_MATCH_LOST. Однако, оно не отображает никаких сообщений. Как я могу вызвать функцию при первом подключении или отключении устройства?

Ответы [ 2 ]

0 голосов
/ 21 июня 2018

Я протестировал этот хак для API 24 и выше.Кажется, он не работает на API 23 и ниже.

Если вы запустите два разных сканирования с двумя разными ScanCallbacks (это очень важно!), Вы получите результаты для обоих сканирований.Пример:

  ScanCallback scanCallback = createScanCallback();
  ScanFilter filter = createScanFilter();
  ScanSettings settings =
      new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).build();
  scanner.startScan(Lists.newArrayList(filter), settings, scanCallback);

  ScanSettings deviceLostSettings =
        new ScanSettings.Builder()
            .setCallbackType(ScanSettings.CALLBACK_TYPE_MATCH_LOST)
            .build();
  // This ScanCallback object MUST be different than the first. 
  ScanCallback deviceLostCallback = createDeviceLostCallback(); 
  scanner.startScan(Lists.newArrayList(filter), deviceLostSettings, deviceLostCallback);
0 голосов
/ 29 мая 2018

Просто добавьте этот широковещательный приемник в свой код, вы можете получать уведомления от этого приемника, просто зарегистрируйте приемник, как только вы подключите устройство BLE.

private final BroadcastReceiver mBroadcastReceiverBluetoothEnableStatus = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            // When discovery finds a device
            if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
                final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR);

                switch (state) {
                    case BluetoothAdapter.STATE_OFF:
                        Log.d(TAG, "onReceive: STATE OFF");
                        break;
                    case BluetoothAdapter.STATE_TURNING_OFF:
                        Log.d(TAG, "mBroadcastReceiverBluetoothEnableStatus: STATE TURNING OFF");
                        break;
                    case BluetoothAdapter.STATE_ON:
                        Log.d(TAG, "mBroadcastReceiverBluetoothEnableStatus: STATE ON");
                        scanDevice();
                        break;
                    case BluetoothAdapter.STATE_TURNING_ON:
                        Log.d(TAG, "mBroadcastReceiverBluetoothEnableStatus: STATE TURNING ON");
                        break;
                }
            }
        }
    };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...