AndroidStudio打开蓝牙、搜索目标设备并进行连接

时间:2024-03-14 22:38:10

一、设置权限

  • 要操作蓝牙,先要在AndroidManifest.xml里加入权限:
  1. BLUETOOTH:允许程序连接到已配对的蓝牙设备
  2. BLUETOOTH_ADMIN:允许程序发现和配对蓝牙设备
  3. RECEIVE_BOOT_COMPLETED:允许一个程序接收到ACTION_BOOT_COMPLETED 广播在系统完成启动 
  4. ACCESS_COARSE_LOCATION:允许一个程序访问CellID或WiFi热点来获取大致的位置。广播接收器接收BluetoothDevice.ACTION_FOUND广播需要该权限
  5. ACCESS_FINE_LOCATION:允许一个程序访问精确位置(如GPS)

 

    AndroidStudio打开蓝牙、搜索目标设备并进行连接

 

二、客户端开启蓝牙

 

    建立蓝牙通信之前需要验证是否有蓝牙设备,以及蓝牙设备是否已经开启。对于一个Android系统而言只有一个蓝牙适配器,通过getDefaultAdapter()方法可以返回其一个实例,如果返回为null,则说明该设备不支持蓝牙。

 

    AndroidStudio打开蓝牙、搜索目标设备并进行连接


    AndroidStudio打开蓝牙、搜索目标设备并进行连接

三、注册搜索蓝牙receiver

  • 当发现目标手机后,在蓝牙socket进行connect()之前,要调用BluetoothAdapter的cancelDiscovery()。

 

    AndroidStudio打开蓝牙、搜索目标设备并进行连接

    AndroidStudio打开蓝牙、搜索目标设备并进行连接

 

四、客户端请求连接

  1. 调用BluetoothDevice的createRfcommSocketToServiceRecord(UUID)获取BluetoothSocket;
  2. 调用BluetoothSocket的connect()方法发起连接;
  3. 由于connect()为阻塞调用,因此该连接过程应该在主线程之外的线程中执行。

 

    AndroidStudio打开蓝牙、搜索目标设备并进行连接

 

五、服务器端开启蓝牙

    AndroidStudio打开蓝牙、搜索目标设备并进行连接

 

    AndroidStudio打开蓝牙、搜索目标设备并进行连接

 

六、服务器端等待连接

  1. 通过蓝牙适配器BluetoothAdapter获取BluetoothServerSocket(Name,UUID);
  2. 使用accept()方法阻塞,当该方法监测到连接的时候,就会返回一个BluetoothSocket对象来管理这个连接, 例如获取输入输出流等。


    AndroidStudio打开蓝牙、搜索目标设备并进行连接

 

  • 有时候客户端搜索不到服务器端蓝牙,以致于不能发起连接请求,此时可以在服务器端加入以下代码以便客户端发现该设备。
  • EXTRA_DISCOVERABLE_DURATION字段可以改变使能时间(不设置时默认时间是120秒,最大不超过300秒)
  • 点击“允许”后,如果蓝牙功能没有开启,系统会自动开启。

 

    AndroidStudio打开蓝牙、搜索目标设备并进行连接


    AndroidStudio打开蓝牙、搜索目标设备并进行连接

七、接收数据(发送数据

 

    AndroidStudio打开蓝牙、搜索目标设备并进行连接

 

    AndroidStudio打开蓝牙、搜索目标设备并进行连接