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

Reply via email to