Android蓝牙实现自动配对,无需输入密码

在项目开发中,需要连接一个蓝牙设备,实现自动配对,经过尝试和分析Android源码,最终问题得以解决:

网上较为流行的ClsUtils工具类并不能满足我的要求,

(1)首先分析一下ClsUtils工具类,通过接受Action为android.bluetooth.device.action.PAIRING_REQUEST的广播,并且在接到广播后,调用一下方法实现自动配对

ClsUtils.setPin(btDevice.getClass(), btDevice, strPsw); // 手机和蓝牙采集器配对
ClsUtils.createBond(btDevice.getClass(), btDevice);
ClsUtils.cancelPairingUserInput(btDevice.getClass(), btDevice);

缺点是,“蓝牙配对请求”对话框会显示一下,然后再消失,并且不是十分可靠,即有的时候“蓝牙配对请求”对话框弹出后不能自己消失,而蓝牙确实已经配对成功了。

(2)我的解决方案:

在开发过程中我们往往通过反射createBond方法,实现配对功能

if (mBluetoothDevice.getBondState() != BluetoothDevice.BOND_BONDED) {

Method creMethod = BluetoothDevice.class.getMethod("createBond");
creMethod.invoke(mBluetoothDevice);

}

配对成功后获取Socket对象,然后执行socket.connect()方法进行连接,开发过程中我发现即使蓝牙设备已经绑定了,在执行socket.connect()方法时还是偶尔会弹出“蓝牙配对请求”对话框,经过分析源码我发现是我创建的Socket的原因,将通过createRfcommSocket创建对象,改为通过createInsecureRfcommSocket创建socket对象后,再执行connect()方法时不会再弹出配对请求,即这种方法只需在第一次绑定成功之后,就再也不用输入密码,而是实现自动配对了。但是我不清楚这对获取的数据会有什么影响!还需要进一步了解

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android操作系统具有本身具有蓝牙功能,并且提供蓝牙API,方便开发人员进行蓝牙开发。本文将介绍如何创建一个蓝牙搜索、自动配对和通信的Demo。 首先,在应用程序清单文件中请求蓝牙权限。在应用程序清单文件中,应该添加以下代码: ``` <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> ``` 然后,在MainActivity中,创建一个BluetoothAdapter的实例并启用蓝牙。接下来,创建一个广播接收器来响应搜索、配对连接的事件。使用设备的名称和地址作为数据存储在搜索结果中。然后,在UI上显示搜索到的设备列表。在使用设备进行通信之前,需要与其进行配对。使用createBond()方法自动配对设备。 ``` bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (!bluetoothAdapter.isEnabled()) { Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableIntent, REQUEST_ENABLE_BT); } final BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (BluetoothDevice.ACTION_FOUND.equals(action)) { BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); String name = device.getName(); String address = device.getAddress(); // add device to list deviceList.add(name + "\n" + address); listAdapter.notifyDataSetChanged(); } else if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) { BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); if (device.getBondState() == BluetoothDevice.BOND_BONDED) { // connect to device for communication connectToDevice(device); } } } }; searchButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { deviceList.clear(); bluetoothAdapter.startDiscovery(); registerReceiver(receiver, new IntentFilter(BluetoothDevice.ACTION_FOUND)); registerReceiver(receiver, new IntentFilter(BluetoothDevice.ACTION_BOND_STATE_CHANGED)); } }); private void connectToDevice(BluetoothDevice device) { BluetoothSocket socket = null; try { socket = device.createRfcommSocketToServiceRecord(MY_UUID); socket.connect(); // start communication } catch (IOException e) { e.printStackTrace(); } } ``` 在这个Demo中,当用户点击搜索按钮时,应用程序将开始搜索周围的设备。当找到设备时,列表将显示设备的名称和地址。然后,当用户选择列表中的设备时,设备将尝试自动配对。如果配对成功,应用程序将使用BluetoothSocket进行通信。 总之,这是一个简单但完整的Android蓝牙搜索、自动配对和通信的Demo,用于学习蓝牙开发的基本思想和方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值