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

Reply via email to