Android 11 蓝牙传输文件源码实现流程
一、流程概述
为了帮助你实现Android 11上的蓝牙文件传输,我们将整个流程分为几个关键步骤。下面是一个简要的流程表,便于你快速理解每个步骤的内容。
步骤 | 描述 |
---|---|
1 | 初始化蓝牙适配器和确认蓝牙权限 |
2 | 发现可连接的蓝牙设备 |
3 | 建立蓝牙连接 |
4 | 发送文件 |
5 | 处理接收端接收文件 |
在接下来的部分中,我们将逐步详细说明每一个步骤,包括所需的代码及其解释。
二、步骤详细说明
1. 初始化蓝牙适配器和确认蓝牙权限
在这个步骤中,你需要初始化蓝牙适配器,并确保应用具有所需的权限。
// 初始化Bluetooth适配器
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
// 检查蓝牙是否可用
if (bluetoothAdapter == null) {
// 设备不支持蓝牙
Log.e("Bluetooth", "Device doesn't support Bluetooth");
}
// 请求开启蓝牙
if (!bluetoothAdapter.isEnabled()) {
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}
// 确认权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.BLUETOOTH}, REQUEST_PERMISSION_BT);
}
BluetoothAdapter.getDefaultAdapter()
:获取本地设备的蓝牙适配器。isEnabled()
:检查蓝牙是否已启用。ACTION_REQUEST_ENABLE
:请求启用蓝牙功能。checkSelfPermission
与requestPermissions
:确认和请求所需的蓝牙权限。
2. 发现可连接的蓝牙设备
接下来,你需要开始搜索可用的蓝牙设备。
// 设置设备发现的广播接收器
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 deviceAddress = device.getAddress();
// 添加到设备列表中
deviceList.add(deviceName + "\n" + deviceAddress);
arrayAdapter.notifyDataSetChanged();
}
}
};
// 注册广播接收器
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(receiver, filter);
// 开始发现
bluetoothAdapter.startDiscovery();
ACTION_FOUND
:事件表示发现了一个设备。getParcelableExtra
:获取发现的蓝牙设备信息。- 你需要维护一个设备列表并更新UI。
3. 建立蓝牙连接
在选择一个可连接的设备后,你需要建立连接。
BluetoothDevice device = bluetoothAdapter.getRemoteDevice(deviceAddress);
BluetoothSocket socket = device.createRfcommSocketToServiceRecord(MY_UUID);
// 连接
try {
socket.connect();
} catch (IOException e) {
Log.e("Bluetooth", "Could not connect to socket");
try {
socket.close();
} catch (IOException closeException) {
Log.e("Bluetooth", "Could not close the client socket", closeException);
}
}
getRemoteDevice(deviceAddress)
:获取远程设备的引用。createRfcommSocketToServiceRecord
:创建RFCOMM通道连接。- 使用
connect()
尝试连接,如果连接失败则捕获异常并关闭 socket。
4. 发送文件
建立连接后,你可以发送文件。
// File file = new File(filePath); // 要发送的文件
byte[] buffer = new byte[1024]; // 创建缓冲区
InputStream inputStream = new FileInputStream(file);
OutputStream outputStream = socket.getOutputStream();
int bytesRead;
// 读取文件并发送
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
outputStream.flush();
inputStream.close();
FileInputStream
:读取要发送的文件。getOutputStream()
:获取连接的输出流。- 循环读取文件并写入输出流,直到文件读取完毕。
5. 处理接收端接收文件
接收端需要监名行来接收传来的数据。假设我们已经建立了连接。
InputStream inputStream = socket.getInputStream();
FileOutputStream fileOutputStream = new FileOutputStream(destinationFilePath);
byte[] buffer = new byte[1024];
int bytesRead;
// 接收数据并写入文件
while ((bytesRead = inputStream.read(buffer)) != -1) {
fileOutputStream.write(buffer, 0, bytesRead);
}
fileOutputStream.close();
inputStream.close();
getInputStream()
:获取输入流以接收数据。FileOutputStream
:将接收到的数据写入目标文件。
三、工作流程图
以下是整个蓝牙传输文件的工作流程图:
journey
title Android 11 蓝牙传输文件流程
section 初始化蓝牙
初始化蓝牙适配器 : 6: 人员A
确认请求蓝牙权限 : 5: 人员A
section 发现设备
开始搜索可连接的设备 : 4: 人员A
选择设备并准备连接 : 5: 人员B
section 建立连接
建立Bluetooth连接 : 6: 人员A
section 发送文件
发送文件 : 5: 人员A
section 接收文件
接收文件并保存 : 4: 人员B
四、总结
通过以上步骤,我们详细介绍了如何在 Android 11 上实现蓝牙文件传输的源码流程。涉及的每一步都至关重要,从初始化蓝牙适配器到建立连接,最后发送和接收文件,皆需要细致处理。
请特别注意,蓝牙权限的申请和设备发现步骤是Android 11中相对复杂的部分,务必确保你的应用有申明BLUETOOTH
和BLUETOOTH_ADMIN
权限。同时,Android 11开始对设备的隐私进行了更严格的管理,确保在合适的时机请求用户授权。
希望这篇文章能帮助你更好地理解蓝牙文件传输的流程,祝你在开发之路上越走越远!