跳到主要内容

Android蓝牙通信

蓝牙通信是Android开发中的一个重要主题,尤其是在需要设备之间进行无线数据传输的场景中。本文将逐步介绍如何在Android应用中实现蓝牙通信,涵盖设备发现、配对、数据传输等关键步骤。

介绍

蓝牙是一种无线通信技术,允许设备在短距离内进行数据传输。在Android开发中,蓝牙通信通常用于连接耳机、键盘、鼠标等外围设备,或者在不同设备之间传输数据。

蓝牙权限

在开始之前,首先需要在AndroidManifest.xml文件中声明蓝牙权限:

xml
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
备注

从Android 6.0(API级别23)开始,访问位置信息是必需的,因为蓝牙扫描需要访问位置权限。

初始化蓝牙适配器

在Android中,蓝牙通信的核心是BluetoothAdapter类。首先,我们需要获取蓝牙适配器的实例:

java
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (bluetoothAdapter == null) {
// 设备不支持蓝牙
Toast.makeText(this, "设备不支持蓝牙", Toast.LENGTH_SHORT).show();
return;
}

启用蓝牙

如果蓝牙未启用,可以通过以下代码请求用户启用蓝牙:

java
if (!bluetoothAdapter.isEnabled()) {
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}
提示

REQUEST_ENABLE_BT是一个自定义的请求码,用于在onActivityResult中处理用户的选择。

发现设备

要发现附近的蓝牙设备,可以使用BluetoothAdapterstartDiscovery()方法:

java
bluetoothAdapter.startDiscovery();

为了接收发现的设备,需要注册一个BroadcastReceiver

java
private final BroadcastReceiver receiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
String deviceName = device.getName();
String deviceHardwareAddress = device.getAddress(); // MAC地址
// 处理发现的设备
}
}
};

IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(receiver, filter);

配对设备

在发现设备后,可以通过BluetoothDevice类的createBond()方法请求配对:

java
device.createBond();

配对过程是异步的,可以通过监听BluetoothDevice.ACTION_BOND_STATE_CHANGED广播来获取配对状态的变化。

建立连接

配对完成后,可以通过BluetoothSocket建立连接。通常,一个设备作为客户端,另一个设备作为服务器。

服务器端

服务器端需要监听传入的连接请求:

java
BluetoothServerSocket serverSocket = bluetoothAdapter.listenUsingRfcommWithServiceRecord("MyApp", MY_UUID);
BluetoothSocket socket = serverSocket.accept(); // 阻塞调用,直到有连接

客户端

客户端需要连接到服务器:

java
BluetoothSocket socket = device.createRfcommSocketToServiceRecord(MY_UUID);
socket.connect();

数据传输

连接建立后,可以通过BluetoothSocket的输入输出流进行数据传输:

java
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();

// 发送数据
String message = "Hello, Bluetooth!";
outputStream.write(message.getBytes());

// 接收数据
byte[] buffer = new byte[1024];
int bytes = inputStream.read(buffer);
String receivedMessage = new String(buffer, 0, bytes);

实际案例

假设我们正在开发一个简单的聊天应用,用户可以通过蓝牙与附近的设备进行聊天。以下是实现步骤:

  1. 设备发现:应用启动时,自动扫描附近的蓝牙设备并显示在列表中。
  2. 配对与连接:用户选择设备后,应用自动进行配对并建立连接。
  3. 聊天功能:连接建立后,用户可以通过输入框发送消息,并实时接收对方的消息。

总结

通过本文,您已经了解了如何在Android应用中实现蓝牙通信。从权限声明到设备发现、配对、连接和数据传输,每个步骤都至关重要。蓝牙通信在物联网、智能家居等领域有着广泛的应用,掌握这一技能将为您的应用开发带来更多可能性。

附加资源

练习

  1. 修改代码,使其在发现设备时显示设备的名称和MAC地址。
  2. 实现一个简单的聊天应用,允许两个设备通过蓝牙进行实时通信。
  3. 探索如何在蓝牙通信中处理异常情况,例如连接中断或设备不可用。

希望本文对您的Android开发之旅有所帮助!继续探索,您将发现更多有趣的技术和应用场景。