6

Android 開発者 Web サイトのコードを使用して範囲内の Bluetooth デバイスを検出し、それらを ArrayAdapter に追加しています。問題は、各デバイスが ArrayAdapter に 5 ~ 6 回追加されることです。今のところ、ここのコードを使用しています: http://developer.android.com/guide/topics/connectivity/bluetooth.html#DiscoveringDevices

ここに私が持っているものがあります:

mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();      
mBluetoothAdapter.startDiscovery();

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);

            // Add the name and address to an array adapter to show in a ListView
            mArrayAdapter.add(device.getName() + "\n" + device.getAddress());
        }
    }
};

これの原因は何ですか?デバイスを ArrayAdapter に 5 回ではなく 1 回だけ追加するにはどうすればよいですか?

4

1 に答える 1

6

バグなのか何なのかはわかりませんが、一部のデバイスでもこれを経験しました。これを解決するには、見つかったデバイスListをいくつかのチェックを付けて一度だけ追加します。下記参照:

private List<BluetoothDevice> tmpBtChecker = new ArrayList<BluetoothDevice>();

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

            // When discovery starts    
            if(BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)){
                //clearing any existing list data
                tmpBtChecker.clear();
            }

            // 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);

                // Add the name and address to an array adapter
                if(!tmpBtChecker.contains(device)){
                   tmpBtChecker.add(device);
                   mArrayAdapter.add(device.getName()+"\n"+device.getAddress());
                }
            }
        }
    };
于 2012-07-31T15:08:30.690 に答える