Есть ли другой способ обнаружить Bluetooth, кроме использования BroadcastReceiver? - PullRequest
0 голосов
/ 15 февраля 2012

Я создал BroadcastReceiver для BluetoothDevice.ACTION_FOUND в службе для сканирования и регистрации доступных устройств Bluetooth.Часть этой услуги заключается в том, чтобы каждые 30 секунд проверять, доступно ли какое-либо из ранее обнаруженных устройств Bluetooth или нет.В настоящее время он выдает ошибку для Leaked IntendReceiver, я могу исправить эту ошибку, однако я просто не уверен, что это правильный способ сделать это.Я создаю новый поток для обработки сканирования по Bluetooth, создаю цикл while, который выполняется каждые 30 секунд, и внутри этого цикла регистрация BroadcastReceiver, перевод потока в спящий режим, к тому времени, когда время ожидания закончится, onReceive дает мне результаты текущего сканирования,затем я отменяю регистрацию BroadcastReceiver и повторяю цикл.

Я отменяю регистрацию BroadcastReceiver после каждого завершения цикла while, потому что при следующем сканировании я получаю список доступных на данный момент устройств, а затем сравниваю это с данными предыдущего сканирования.

Это удовлетворяет моему требованиюОднако у меня есть сильное чувство, что это не правильный дизайн.Не могли бы вы посоветовать мне альтернативный подход?Спасибо ..

Ниже приведен соответствующий код из Службы -

 class ScanBT extends Thread 
{
     static final long DELAYBT = 30000;

        @Override       
        public void run()
          {

            isBTRunning = true;
            Looper.prepare(); 
            BluetoothAdapter mBluetoothAdapter =BluetoothAdapter.getDefaultAdapter();

            try { 
                Log.d(TAG, "BT Scanning started");

                while(isBTRunning)
                { 

                if (!mBluetoothAdapter.isEnabled())
                {
                        mBluetoothAdapter.enable();                     
                        Thread.sleep(15000);                    
                }

                IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
                registerReceiver(mReceiver, filter);

                mBluetoothAdapter.startDiscovery();
                Log.d(TAG,"Inside while loop for BT");
                Thread.sleep(DELAYBT);
                unregisterReceiver(mReceiver);
             }
                Looper.loop();
            }
            catch (InterruptedException e) {
                Log.d(TAG, "BT Scanning stopped");
                    Looper.myLooper().quit();
            }

          }     
}

    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {

        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();

            // When discovery finds a device
            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                // Get the BluetoothDevice object from the Intent
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

                        BTDevice =  device.getName(); 
                BTAddress = device.getAddress();
                Log.d(TAG,"BT Found name: " + BTDevice);
                Log.d(TAG,"BT Found address: " + BTAddress);
                        //Code to compare with previous scan results
            }
        }
    };

1 Ответ

1 голос
/ 22 февраля 2012

Разобрался.Нет другого способа добиться этого.Чтобы контролировать производительность, я сейчас регистрирую приемник только один раз, а затем запускаю обнаружение внутри цикла с интервалом ожидания 60 секунд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...