How to scan for available bluetooth devices in range in android?
Asked Answered
A

4

24

I need to get a list of available bluetooth devices in the area using google android 2.1.

Thing is, i don't just need a list of those devices, i need some unique id for each device found and i need an indicator, how "good" the signal is received (like the "level" in android.wifi.ScanResult)... How do i do that?

Aggravate answered 3/7, 2010 at 8:18 Comment(0)
L
53

Check out code below :

Starting search

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

    //Finding devices                 
    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());
    }
  }
};

IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); 
registerReceiver(mReceiver, filter);
Logue answered 28/5, 2012 at 9:59 Comment(5)
Nice clean code, this should be the correct answer.Punt
@SaharMillis: What about it doesn't work for you? It works fine, but your other device needs to be discoverable, not just with bluetooth on.Eclair
how does this work if there are multiple bluetooth devices found in the range. Does the receiver get triggered multiple times?Finbar
@Finbar the BroadcastReceiver gets notified once per device; therefore one has to keep them in an ArrayList field, or alike... while there are two? further actions available, beside the BluetoothDevice.ACTION_FOUND, of which one indicates the scan being complete.Submerged
@SaharMillis make sure you have put permission in the manifest of location and BluetoothDeadly
B
14

Call method bluetoothScanning, context is required

void bluetoothScanning(){

    IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
    context.registerReceiver(mReceiver, filter);
    final BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    mBluetoothAdapter.startDiscovery();

}


// Create a BroadcastReceiver for ACTION_FOUND.
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (BluetoothDevice.ACTION_FOUND.equals(action)) {
            // Discovery has found a device. Get the BluetoothDevice
            // object and its info from the Intent.
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            String deviceName = device.getName();
            String deviceHardwareAddress = device.getAddress(); // MAC address

            Log.i("Device Name: " , "device " + deviceName);
            Log.i("deviceHardwareAddress " , "hard"  + deviceHardwareAddress);
        }
    }
};

Result

Name: LE-Bose Revolve+ SoundLink deviceHardwareAddress: MAC .....

Buffer answered 24/1, 2018 at 14:36 Comment(2)
Nice example. Note that deviceName may be null.Tosspot
@Tosspot this is my exact problem. it was working fine, but then it started to show only mac addresses and not names. can't figure out whyCallida
S
1

This code uses BeaconManager, it continuously scans for new Bluetooth devices and returns a Beacons List object which you can use to get what ever information you need.

Make sure you import BeaconManager

private BeaconManager beaconManager;

//In onCreate method
beaconManager = BeaconManager.getInstanceForApplication(this);
beaconManager.getBeaconParsers().add(new BeaconParser().
                setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));

//use these out of the onCreate method
public void onScanStart(View view) {
        stopScanButton.setEnabled(true);
        scanningButton.setEnabled(false);
        beaconManager.bind(this);
}

@Override
public void onBeaconServiceConnect() {
    beaconManager.removeAllRangeNotifiers();
    beaconManager.addRangeNotifier(new RangeNotifier() {
    @Override
    public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
    for (Beacon b : beacons) {
        System.out.println(String.format("%s: %f: %d", b.getBluetoothName(), b.getDistance(), b.getRssi()));
  });
    try {
//Tells the BeaconService to start looking for beacons that match the passed.
        beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null));
    } catch (RemoteException e) {
        Toast.makeText(this, e.toString(), Toast.LENGTH_LONG).show();
    }
}

Let me know if that works for you!

Slicer answered 12/9, 2019 at 9:24 Comment(0)
B
1

To able to discovery devices by bluetooth. Make sure you

AndroidManifest.xml

<uses-permission
    android:name="android.permission.BLUETOOTH"
    android:maxSdkVersion="30" />
<uses-permission
    android:name="android.permission.BLUETOOTH_ADMIN"
    android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

MainActivity

class MainActivity : AppCompatActivity() {

    private var bluetoothAdapter: BluetoothAdapter? = null
    private val bluetoothReceiver: BroadcastReceiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent) {
            val action = intent.action
            Log.i("TAG", "onReceive $action")
            if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED == action) {
                Log.i("TAG", "Discovery finished, hide loading")
            } else if (BluetoothDevice.ACTION_FOUND == action) {
                val device =
                    intent.getParcelableExtra<BluetoothDevice>(BluetoothDevice.EXTRA_DEVICE)

                Log.i("TAG", "Device Name: " + (device?.name ?: ""))
                Log.i("TAG", "Device Address:" + (device?.address ?: ""))
            }
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        ...

        findViewById<Button>(R.id.button_start_discovery).setOnClickListener {
            if (bluetoothAdapter == null) {
                initBluetoothDiscovery()
            }
            startDiscovery()
        }
    }

    private fun initBluetoothDiscovery() {
        val bluetoothManager = getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
        bluetoothAdapter = bluetoothManager.adapter
        val intentFilter = IntentFilter().apply {
            addAction(BluetoothDevice.ACTION_FOUND)
            addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)
        }
        registerReceiver(bluetoothReceiver, intentFilter)
    }

    private fun startDiscovery() {
        if (bluetoothAdapter?.isDiscovering == true) {
            Log.i("TAG", "cancel start discovery")
            bluetoothAdapter?.cancelDiscovery()
        }
        Log.i("TAG", "start discovery, show loading")
        bluetoothAdapter?.startDiscovery()
    }

    override fun onDestroy() {
        super.onDestroy()
        bluetoothAdapter?.cancelDiscovery();
        unregisterReceiver(bluetoothReceiver);
    }
}
Breeks answered 28/8, 2021 at 15:27 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.