除了使用BroadcastReceiver之外,还有其他方法可以发现蓝牙吗?

时间:2012-02-15 05:07:39

标签: android service bluetooth

我在服务中为BluetoothDevice.ACTION_FOUND创建了一个BroadcastReceiver来扫描和记录可用的蓝牙设备。如果任何以前找到的蓝牙设备仍然可用,则该服务的一部分是每30秒继续检查一次。目前它为Leaking IntendReceiver抛出了一个错误,我可以解决这个错误,但是我不相信这是正确的方法。 我正在创建一个处理蓝牙扫描的新线程,创建一个每30秒运行一次的while循环,并在该循环中注册BroadcastReceiver,将线程置于睡眠状态,当睡眠时间超过onReceive时,我会得到当前扫描的结果,然后我取消注册BroadcastReceiver并重复循环。

我在每次完成while循环后取消注册BroadcastReceiver,因为下一次扫描会给出当前可用设备的列表,然后我将其与之前的扫描数据进行比较。

它满足了我的要求,但我有一种强烈的感觉,它不是正确的设计。你能否就另一种方法向我提出建议?感谢..

以下是服务的相关代码 -

 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 个答案:

答案 0 :(得分:1)

想出来。没有其他方法可以实现这一目标。为了控制性能,我现在只注册接收器一次,然后在60秒的睡眠间隔内循环开始发现。