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:请求启用蓝牙功能。
  • checkSelfPermissionrequestPermissions:确认和请求所需的蓝牙权限。

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中相对复杂的部分,务必确保你的应用有申明BLUETOOTHBLUETOOTH_ADMIN权限。同时,Android 11开始对设备的隐私进行了更严格的管理,确保在合适的时机请求用户授权。

希望这篇文章能帮助你更好地理解蓝牙文件传输的流程,祝你在开发之路上越走越远!