首先要实现一个扫描周围蓝牙设备并显示的功能,显示功能比较适合的控件是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的点击事件中进行连接操作。