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

