首先要实现一个扫描周围蓝牙设备并显示的功能,显示功能比较适合的控件是ListView,然后通过点击触发与蓝牙设备的连接,链接后就可以进行具体的通讯操作。

使用以及扫描蓝牙设备需要声明权限:

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

其中的android.permission.ACCESS_FINE_LOCATION在Android6.0以上系统中运行时,需要运行时权限处理。

蓝牙扫描关键类:BluetoothAdapter
这个类的实例可以通过BluetoothAdapter.getDefaultAdapter();代码获取,如果返回值为null,就代表设备不支持蓝牙。

private final BluetoothAdapter DEFAULT_ADAPTER = BluetoothAdapter.getDefaultAdapter();

获得实例后,可以通过调用它的方法启动扫描或提前结束扫描,开启关闭蓝牙等操作。
先判断是否支持蓝牙:

if (null == bluetoothAdapter) { // 返回null表示设备不支持蓝牙
            Toast.makeText(this, "蓝牙初始化失败", Toast.LENGTH_SHORT).show();
            return;
        }
        // 检测蓝牙是否打开,未打开则申请打开
        if (!bluetoothAdapter.isEnabled()) {
            Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(intent, REQUEST_ENABLE_BT);
        }

这里为了回调用户是否同意打开蓝牙,所以使用了startActivityForResult方法,如果只是申请打开蓝牙,也可以使用BluetoothAdapter自带的开启蓝牙的方法

bluetoothAdapter.enable();

发现设备:

// 开始扫描,一般持续12秒左右,会占用BluetoothAdapter的大量资源
        // 所以一定要在再次使用BluetoothAdapter前先将扫描停止
        bluetoothAdapter.startDiscovery();

这是一个异步调用,启动后手机会自动扫描周围的蓝牙设备,当检测到一个蓝牙设备时,安卓会发出一个广播,这个广播中携带了设备信息,所以我们还需要注册一个广播接收器来进行监听。

// 注册广播接收器
        IntentFilter intentFilter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        BroadcastReceiver BT_RECEIVER = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                // 获取新增的设备信息对象
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                // 获取名称和地址
                String s = "新设备名称:" + device.getName() +
                        "\n设备MAC:" + device.getAddress();
                // 下面可以进行个性化的逻辑处理...
                
            }
        };
        registerReceiver(BT_RECEIVER, intentFilter);

这样,我们就可以获取到周围的蓝牙设备对象了。这点代码只为演示功能,所以尽量简洁。
实际使用时,可以设置当接收到广播后将设备信息添加到ListView进行显示,并在ListView的点击事件中进行连接操作。