蓝牙常用类及常用方法
BluetoothAdapter 蓝牙适配器
- cancelDiscovery() 取消发现,也就是说当我们正在搜索设备的时候调用这个方法将不再继续搜索,在销毁蓝牙广播前或与服务器连接前使用。
- disable() 关闭蓝牙
- enable() 打开蓝牙,这个方法打开蓝牙不会弹出提示,更多的时候我们需要问下用户是否打开,一下这两行代码同样是打开蓝牙,不过会提示用户:
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(intent, requestCode); - getAddress() 获取本地蓝牙地址
- getDefaultAdapter() 获取默认BluetoothAdapter,唯一一个。
- getName() 获取本地蓝牙名称
- getRemoteDevice(String address) 根据蓝牙地址获取远程蓝牙设备
- getState() 获取本地蓝牙适配器当前状态(感觉可能调试的时候更需要)
- isDiscovering() 判断当前是否正在查找设备,是返回true
- isEnabled() 判断蓝牙是否打开,已打开返回true,否则,返回false
- listenUsingRfcommWithServiceRecord(String name,UUID uuid) 根据名称,UUID创建并返回BluetoothServerSocket,这是创建BluetoothSocket服务器端的第一步
- startDiscovery()开始搜索,startDiscovery()方法是一个异步方法,调用后会立即返回。该方法会进行对其他蓝牙设备的搜索,该过程会持续12秒。该方法调用后,搜索过程实际上是在一个System Service中进行的,所以可以调用cancelDiscovery()方法来停止搜索(该方法可以在未执行discovery请求时调用)。
请求Discovery后,系统开始搜索蓝牙设备,在这个过程中,系统会发送以下三个广播:
ACTION_DISCOVERY_START:开始搜索
ACTION_DISCOVERY_FINISHED:搜索结束
ACTION_FOUND:找到设备,这个Intent中包含两个extra fields:EXTRA_DEVICE和EXTRA_CLASS,分别包含BluetooDevice和BluetoothClass。
BluetoothDevice 描述了一个蓝牙设备
- createRfcommSocketToServiceRecord(UUIDuuid) 根据UUID创建并返回一个BluetoothSocket
- getState() 蓝牙状态这里要说一下,只有在 BluetoothAdapter.STATE_ON 状态下才可以监听,具体可以看andrid api;
- 这个类其他的方法,如getAddress(),getName(),同BluetoothAdapter
BluetoothServerSocket
这个类一种只有三个方法两个重载的accept(),accept(inttimeout)两者的区别在于后面的方法指定了过时时间,需要注意的是,执行这两个方法的时候,直到接收到了客户端的请求(或是过期之后),都会阻塞线程,应该放在新线程里运行!还有一点需要注意的是,这两个方法都返回一个BluetoothSocket,最后的连接也是服务器端与客户端的两个BluetoothSocket的连接。
BluetoothSocket
跟BluetoothServerSocket相对,是客户端一共5个方法,不出意外,都会用到。
- close(), 关闭
- connect() 连接
- getInptuStream() 获取输入流
- getOutputStream() 获取输出流
- getRemoteDevice() 获取远程设备,这里指的是获取bluetoothSocket指定连接的那个远程蓝牙设备
BluetoothClass 描述了设备通用特性和功能的蓝牙类
- class BluetoothClass.Device 定义所有设备类的常量
- public int getDeviceClass () 返回BluetoothClass中的设备类部分(主要的和较小的)
- public int getMajorDeviceClass () 返回BluetoothClass中设备类的主要部分
- class BluetoothClass.Service 定义所有服务类的常量
蓝牙配对与取消配对
- 蓝牙配对:
if (device.getBondState() == BluetoothDevice.BOND_NONE) {
//版本号大于23,可以直接用device.createBond(),小于23时则用反射
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
device.createBond();
adapter.notifyDataSetChanged();
} else {
//适配
try {
Method method = BluetoothDevice.class.getMethod("createBond");
method.invoke(device);
adapter.notifyDataSetChanged();
} catch