You should have 2 broadcast receivers. one for getting the discovered bluetooth devices in your list using ACTION_FOUND intent filter.
second one is for Knowing when the discovery is completed using ACTION_DISCOVERY_FINISHED. In this broadcast receiver, you should take the devices list when you the the event for discovery finished. On Tue, Jul 12, 2011 at 9:07 AM, gjs <[email protected]> wrote: > Hi, > > Have a look at > http://developer.android.com/resources/samples/BluetoothChat/index.html > > In particular > > http://developer.android.com/resources/samples/BluetoothChat/src/com/example/android/BluetoothChat/DeviceListActivity.html > > And read this carefully > http://developer.android.com/guide/topics/wireless/bluetooth.html > > Regards > > On Jul 9, 9:26 am, Bassel Yahia <[email protected]> wrote: > > Hi, > > > > I am having a real problem here with discovering bluetooth devices. I > > am making a method that returns a List with all devices that were > > discovered. This method triggers other methods that executes the > > discovery and establish the BroadcastReceivers. > > THE PROBLEM is that the method returns before the BroadcastReceivers > > finds the devices. This results in returning an empty list every time > > by the getDiscoveredList() because the List hasn't been filled yet by > > the Receivers. List made global where all methods and Receivers share > > the same List. The List is filled with devices after the method > > returns. > > > > Here is my code: > > > > ArrayList<Device> discoveredDevices = new ArrayList<Device>(); > > > > public ArrayList<Device> getDiscoveredList() { > > > > isDiscovering = true; > > monitorDiscovery(); > > > > discoverDevices(); > > > > Log.d("Save", "Before - btAdapter.isDiscovering() > > "+btAdapter.isDiscovering()); > > while (btAdapter.isDiscovering()) { > > // Waiting for discovery to end. Assuming > > that during discovery devices have already been added > > // in discoveredDevices because they are > > added when BluetoothDevice.ACTION_FOUND > > // When discovery ends, no nearby devices is > > expected to be found by the > > // discoveryResult BroadcastReceiver because > > I am not discovering outside this loop > > } > > > > Log.d("Save", "After - btAdapter.isDiscovering() > > "+btAdapter.isDiscovering()); > > Log.d("Save", "Returning from getDiscoveredList()"); > > return discoveredDevices; > > } > > > > private void monitorDiscovery() { > > registerReceiver(discoveryMonitor, new IntentFilter( > > > BluetoothAdapter.ACTION_DISCOVERY_STARTED)); > > registerReceiver(discoveryMonitor, new IntentFilter( > > > BluetoothAdapter.ACTION_DISCOVERY_FINISHED)); > > } > > > > private void discoverDevices() { > > > > while (!btAdapter.isEnabled()) { // If Bluetooth is > still > > opening, then wait till opened > > } > > discoveredDevices.clear(); //Clear the List > > btAdapter.startDiscovery(); > > while (!btAdapter.isDiscovering()) { //Wait till > discovery > > starts > > } > > BroadcastReceiver discoveryResult = new > BroadcastReceiver() { > > @Override > > public void onReceive(Context context, Intent > intent) { > > BluetoothDevice remoteDevice; > > remoteDevice = intent > > > .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); > > short rssi = > intent.getShortExtra(BluetoothDevice.EXTRA_RSSI, > > Short.MIN_VALUE); > > > > Toast.makeText( > > getApplicationContext(), > > "Discovered: " + > remoteDevice.getName() + " RSSI: " > > + rssi, > Toast.LENGTH_SHORT).show(); > > > > if > (!discoveredDevices.contains(remoteDevice)) { > > discoveredDevices.add(new > Device(remoteDevice, rssi)); > > Log.d("Save", "Name: " + > remoteDevice.getName()); > > Log.d("Save", "Address: " + > remoteDevice.getAddress()); > > Log.d("Save", "RSSI: " + rssi); > > Log.d("Save", "Size Now: " + > discoveredDevices.size()); > > } > > } > > }; > > registerReceiver(discoveryResult, new > > IntentFilter(BluetoothDevice.ACTION_FOUND)); > > > > return; > > } > > > > BroadcastReceiver discoveryMonitor = new BroadcastReceiver() { > > > > String dStarted = > BluetoothAdapter.ACTION_DISCOVERY_STARTED; > > String dFinished = > BluetoothAdapter.ACTION_DISCOVERY_FINISHED; > > > > @Override > > public void onReceive(Context context, Intent intent) { > > if (dStarted.equals(intent.getAction())) { > > // Discovery has started. > > Log.d("Save", "Discovery Started..."); > > } else if (dFinished.equals(intent.getAction())) > { > > Log.d("Save", "Discovery Finished..."); > > Log.d("Save", "doneDiscovering() > isDiscovering = false"); > > isDiscovering = false; > > Log.d("Save","Discovery Completed... > > discoveredDevices Size = " > > + > discoveredDevices.size()); > > for (int i = 0; i < > discoveredDevices.size(); i++) { > > Log.d("Save", "Device(" + i + "): > " > > + > discoveredDevices.get(i).getDevice().getName() > > + " RSSI= " + > discoveredDevices.get(i).getRssi()); > > } > > Log.d("Save", "Size at doneDiscovering() : > > "+discoveredDevices.size()); > > } > > } > > }; > > > > Monitoring the LogCat, the getDiscoveredList() method is executed and > > returns before the BroadcastReceiver discoveryMonitor or the > > BroadcastReceiver discoveryResult does anything although they are > > triggered within this method, and it is ensured by the LogCat that the > > discovery starts and ends before returning. > > > > I JUST CAN'T UNDERSTAND how can discovery starts and ends before > > saving the discovered devices or event logging "Discovery Started..." > > and "Discovery Completed..." which is logged when the intentAction is > > startedDiscovery or endedDiscovery. > > It looks as the program is insisting to complete the method > > getDiscoveredList() before monitoring the bluetooth discovery because > > I tried to pause the method until the devices are saved or so, but > > this didn't do nothing. The method was paused, then after that it > > returned then the discovery work happened! > > > > PLEASE I need help because I am so desperate with this problem. I have > > tried every single turn-around I am aware of, but nothing happened. It > > seems because I don't know something about the order these methods or > > Receivers work in. > > -- > You received this message because you are subscribed to the Google > Groups "Android Developers" group. > To post to this group, send email to [email protected] > To unsubscribe from this group, send email to > [email protected] > For more options, visit this group at > http://groups.google.com/group/android-developers?hl=en > -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/android-developers?hl=en

