首先,要操作蓝牙,先要在 AndroidManifest.xml 里加入权限
<uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permissionandroid:name="android.permission.BLUETOOTH" />
一、常用类 然后,看下 api,Android 所有关于蓝牙开发的类都在 android.bluetooth 包下,如下图,只有 8 个类
而我们需要用到了就只有几个而已:
1.BluetoothAdapter
顾名思义,蓝牙适配器,直到我们建立 bluetoothSocket 连接之前,都要不断操作它 BluetoothAdapter 里的方法很多,常用的有以下几个:
cancelDiscovery() 根据字面意思,是取消发现,也就是说当我们正在搜索设备的时候调用这 个方法将不再继续搜索
disable()关闭蓝牙
enable()打开蓝牙,这个方法打开蓝牙不会弹出提示,更多的时候我们需要问下用户是否打 开,
以下这两行代码同样是打开蓝牙,不过会提示用户:
Intent enabler=new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enabler,reCode);//同 startActivity(enabler);
getAddress()获取本地蓝牙地址
getDefaultAdapter() 获取默认 BluetoothAdapter,实际上,也只有这一种方法获取 BluetoothAdapter
getName()获取本地蓝牙名称
getRemoteDevice(String address)根据蓝牙地址获取远程蓝牙设备
getState()获取本地蓝牙适配器当前状态(感觉可能调试的时候更需要)
isDiscovering()判断当前是否正在查找设备,是返回 true
isEnabled()判断蓝牙是否打开,已打开返回 true,否则,返回 false
listenUsingRfcommWithServiceRecord(String name,UUID uuid)根据名称,UUID 创建并返回 BluetoothServerSocket,这是创建 BluetoothSocket 服务器端的第一步
startDiscovery()开始搜索,这是搜索的第一步
2.BluetoothDevice
看名字就知道,这个类描述了一个蓝牙设备
createRfcommSocketToServiceRecord(UUIDuuid)根据 UUID 创建并返回一个 BluetoothSocket
这个方法也是我们获取 BluetoothDevice 的目的——创建 BluetoothSocket 这个类其他的方法,如 getAddress(),getName(),同 BluetoothAdapter3.BluetoothServerSocket 如果去除了 Bluetooth 相信大家一定再熟悉不过了,既然是 Socket,方法就应该都差不多, 这个类一种只有三个方法 两个重载的 accept(),accept(int timeout)两者的区别在于后面的方法指定了过时时间,需要注 意的是,执行这两个方法的时候,直到接收到了客户端的请求(或是过期之后),都会阻塞 线程,应该放在新线程里运行!
还有一点需要注意的是,这两个方法都返回一个 BluetoothSocket,后的连接也是服务器端 与客户端的两个 BluetoothSocket 的连接
close()这个就不用说了吧,关闭socket链接
4.BluetoothSocket
跟 BluetoothServerSocket 相对,是客户端
一共 5 个方法,不出意外,都会用到
close()关闭
connect()连接
getInptuStream()获取输入流
getOutputStream()获取输出流
getRemoteDevice()获取远程设备,这里指的是获取 bluetoothSocket 指定连接的那个远程蓝牙 设备。
二、用法:
1、获取本地蓝牙适配器
BluetoothAdapter mAdapter= BluetoothAdapter.getDefaultAdapter();
2、打开蓝牙
if(!mAdapter.isEnabled()){ //弹出对话框提示用户是后打开
Intent enabler = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enabler, REQUEST_ENABLE);
//下面不做提示,强行打开
// mAdapter.enable();
}
3、搜索设备
1)刚才说过了 mAdapter.startDiscovery() 是第一步,可以你会发现没有返回的蓝牙设备,怎么知道查找到了呢?向下看,不要急
2)定义 BroadcastReceiver,关于 BroadcastReceiver 不多讲了,不是今天的讨论内容,代码如下
BroadcastReceiver mReceiver = 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);
if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
Log.e(TAG, "find device:" + device.getName() + device.getAddress());
}
} //搜索完成
else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED .equals(action)) {
setTitle("搜索完成");
if (mNewDevicesAdapter.getCount() == 0) {
Log.v(TAG,"find over");
}
}
//执行更新列表的代码
}
};
这样,没当查找到新设备或是搜索完成,相应的操作都在上段代码的两个 if 里执行了,不 过前提是你要先注册 BroadcastReceiver,具体代码如下
IntentFilter filterFOUND = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(mReceiver, filterFOUND);
IntentFilter filterFINISHED = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
registerReceiver(mReceiver, filterFINISHED);
(这段代码,一般写在 onCreate()里..)
4、建立连接 首先 Android sdk(2.0 以上版本)支持的蓝牙连接是通过 BluetoothSocket 建立连接(说的不 对请高人指正),服务器端(BluetoothServerSocket)和客户端(BluetoothSocket)需指定同 样的 UUID,才能建立连接,因为建立连接的方法会阻塞线程,所以服务器端和客户端都应 启动新线程连接
1)服务器端:
BluetoothServerSocket serverSocket = mAdapter.listenUsingRfcommWithServiceRecord(serverSocketName,UUID);
serverSocket.accept();
2)客户端:
//还记得我们刚才在 BroadcastReceiver 获取了 BLuetoothDevice 么?BluetoothSocket clienSocket=dcvice. createRfcommSocketToServiceRecord(UUID);
clienSocket.connect();
5、数据传递 通过以上操作,就已经建立的 BluetoothSocket 连接了,数据传递无非是通过流的形式
1)获取流inputStream = socket.getInputStream();
outputStream = socket.getOutputStream();
2)写出、读入和对普通的socket的写出读入一样,需要放到线程中操作
inputStream.read();
<pre name="code" class="java">outputStream.write();
android.bluetooth 下有 8 个类,还有 4 个类没有用到,那 4 个类里定义的都是常量