最近在开发蓝牙,由于是使用的模块开发,但是andriod的系统的经典蓝牙也需要熟悉和知道。在这个背景下,参考了网络上的一些资料,完善了demo,方便了后来者能初步运用相关的蓝牙。站在巨人的肩旁上,才能走的更远。
一、整体思路和对应相关方法
1、获得BluetoothAdapter:BluetoothAdapter.getDefaultAdapter();
2、打开蓝牙:询问用户打开(推荐)或直接bluetoothAdapter.enable();
3、查询已绑定设备,发现新设备:bluetoothAdapter.getBondedDevices();bluetoothAdapter.startDiscovery();
4、配对相关的设备,自定配对相关的类,配对设置pin值配对蓝牙设备。 ClsUtils.createBond(btDevice.getClass(), btDevice);
5.1、服务端,一直监听请求,当该端主动发出请求时,关闭该端的监听,角色转为客户端:
bluetoothDevice.createRfcommSocketToServiceRecord(UUID);
45.2、客户端,点击目标设备,配对连接:
bluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME, UUID);
6、通过BluetoothSocket通信:IO流读写
二、开发详解
1、声明权限,注意可能需要的运行时权限
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
android 6.0以上设备发现新蓝牙时,需加入运行时权限,否则无法监听ACTION_FOUND广播
if (Build.VERSION.SDK_INT >= 6.0) {
ActivityCompat.requestPermissions(getActivity(),
new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
Params.MY_PERMISSION_REQUEST_CONSTANT);
}
public void onRequestPermissionsResult(int requestCode, String permissions[],
int[] grantResults) {
switch (requestCode) {
case Params.MY_PERMISSION_REQUEST_CONSTANT: {
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 运行时权限已授权
}
return;
}
}