蓝牙的最基本的用法,搜索和配对!
首先看下效果如下
开启蓝牙
开启蓝牙需要注册清单文件,初始化蓝牙适配器,添加广播监听,最后才是正式开启蓝牙。
清单文件加权限
<!-- 蓝牙权限 -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
5.0以上的版本需要加入gps权限
<!-- 5.0之后蓝牙需要获取gps权限 -->
<uses-feature android:name="android.hardware.location.gps" />
6.0以上的版本需要手动申请定位权限
<!-- 6.0之后蓝牙需要位置权限 记得用6.0后的权限访问 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
注:6.0加入权限之后记得手动获取权限!不然蓝牙功能无法正常使用
初始化蓝牙(BluetoothAdapter)
初始化相当简单直接调用getDefaultAdapter
方法就可以了
//初始化蓝牙
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (bluetoothAdapter == null) {
Toast.makeText(this, "设备不存在蓝牙", Toast.LENGTH_SHORT).show();
return;
}
初始化之后就可以用BluetoothAdapter对象进行对蓝牙的操作
BluetoothAdapter常用方法表格如下
方法 | 说明 |
---|---|
getDefaultAdapter | 默认本地适配器,如果此硬件平台不支持蓝牙,则为空。 |
isEnabled | 如果蓝牙当前已启用并准备好使用,则返回true。 |
getState | 获取本地蓝牙适配器的当前状态。STATE_OFF(关闭)、STATE_TURNING_ON(正在打开)、STATE_ON(开启)、STATE_TURNING_OFF(正在关闭) |
enable | 强制开启蓝牙 |
disable | 强制关闭蓝牙 |
disable(boolean persist) | 强制关闭蓝牙,是否保留设置。 |
getAddress | 获取蓝牙地址 |
getName | 获取蓝牙名字 |
factoryReset | 出厂重置蓝牙 |
setName(String name) | 设置蓝牙名字 |
getScanMode | 获取蓝牙的扫描模式,扫描模式确定是否可以连接或被发现。SCAN_MODE_NONE(蓝牙未开启)、SCAN_MODE_CONNECTABLE(不可见)、SCAN_MODE_CONNECTABLE_DISCOVERABLE(可见) |
setScanMode(@ScanMode int mode, int duration) | (需要使用反射)设置蓝牙的扫描模式,单独的setScanMode(int mode)改变状态设置默认蓝牙可见时间 |
getDiscoverableTimeout、setDiscoverableTimeout(int timeout) | (需要使用反射)获取和设置默认蓝牙可见时间 |
startDiscovery | 开始扫描其他蓝牙 |
cancelDiscovery | 取消扫描 |
isDiscovering | 是否在扫描中 |
getBondedDevices | 获取已绑定蓝牙 |
getConnectionState | 获取蓝牙连接状态。STATE_CONNECTED(已连接)、STATE_DISCONNECTED(未连接)、STATE_CONNECTING(连接中) |
添加广播
初始化之后就需要监听蓝牙的广播,不然无法获取搜索到了蓝牙设备
//绑定广播
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothDevice.ACTION_FOUND);//找到设备的广播
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);//搜索完成的广播
filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);//蓝牙状态改变的广播
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);//开始扫描的广播
filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);//配对状态改变
registerReceiver(mReceiver, filter);
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
BluetoothDevice bluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
// Log.e("-s-", "action = " + action);
switch (action) {
//蓝牙状态改变
case BluetoothAdapter.ACTION_STATE_CHANGED:
Log.e("-s-", "蓝牙状态改变");
checkBluetooth();
break;
//开始扫描
case BluetoothAdapter.ACTION_DISCOVERY_STARTED:
Log.e("-s-", "开始扫描蓝牙");
allAdapter.clear();
changeText("开始扫描蓝牙");
showToast("开始扫描蓝牙");
break;
//搜索完成
case BluetoothAdapter.ACTION_DISCOVERY_FINISHED:
Log.e("-s-", "搜索完成");
changeText("搜索完成");
showToast("搜索完成");
break;
//找到设备
case BluetoothDevice.ACTION_FOUND:
Log.e("-s-", "找到设备");
changeText("搜索中...");
printDevice(bluetoothDevice);
allAdapter.add(bluetoothDevice);
break;
//配对状态改变
case BluetoothDevice.ACTION_BOND_STATE_CHANGED:
Log.e("-s-", "配对状态改变");
if (bluetoothDevice.getBondState() == BluetoothDevice.BOND_BONDING) {
changeText(bluetoothDevice.getName() + " 配对中");
Log.e("-s-", "配对中");
} else if (bluetoothDevice.getBondState() == BluetoothDevice.BOND_BONDED) {
changeText(bluetoothDevice.getName() + " 已配对成功");
Log.e("-s-", "已配对成功");
} else {
changeText(bluetoothDevice.getName() + " 已取消配对");
Log.e("-s-", "已取消配对");
}
printDevice(bluetoothDevice);
updataBonds();
break;
default:
}
}
};
以上代码有常用的几个蓝牙相关的广播,这边主要讲下另一个比较需要注意的APIBluetoothDevice
以下表格是常用的BluetoothDevice方法
方法 | 说明 |
---|---|
getAddress | 获取蓝牙设备的地址 |
getName | 获取蓝牙设备的名称(可能会空) |
get |