BluetoothConnectActivityReceiver.java:监听蓝牙配对的广播 代码: package com.imte.Broadcast; import com.imte.utils.ClsUtils; import com.itme.ActivityClass.R; import android.bluetooth.BluetoothDevice; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Handler; import android.util.Log; import android.widget.Toast; public class BluetoothConnectActivityReceiver extends BroadcastReceiver { String strPsw = "123456"; @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub if (intent.getAction().equals( "android.bluetooth.device.action.PAIRING_REQUEST")) { BluetoothDevice btDevice = intent .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); try { ClsUtils.setPin(btDevice.getClass(), btDevice, strPsw); // 手机和蓝牙采集的装置配对 ClsUtils.createBond(btDevice.getClass(), btDevice); ClsUtils.cancelPairingUserInput(btDevice.getClass(), btDevice); Toast.makeText( context, context.getResources().getString( R.string.bluetooth_connect_success), Toast.LENGTH_SHORT); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); // Thread thread=new Thread(strPsw); // thread. } } } } ClsUtils.java? package com.imte.utils; /************************************ 蓝牙配对函数 * **************/ import java.lang.reflect.Field; import java.lang.reflect.Method; import android.bluetooth.BluetoothDevice; import android.util.Log; public class ClsUtils { /** * 与设备配对 参考源码:platform/packages/apps/Settings.git * /Settings/src/com/android/settings/bluetooth/CachedBluetoothDevice.java */ static public boolean createBond(Class btClass, BluetoothDevice btDevice) throws Exception { Method createBondMethod = btClass.getMethod("createBond"); Boolean returnValue = (Boolean) createBondMethod.invoke(btDevice); return returnValue.booleanValue(); } /** * 与设备解除配对 参考源码:platform/packages/apps/Settings.git * /Settings/src/com/android/settings/bluetooth/CachedBluetoothDevice.java */ static public boolean removeBond(Class btClass, BluetoothDevice btDevice) throws Exception { Method removeBondMethod = btClass.getMethod("removeBond"); Boolean returnValue = (Boolean) removeBondMethod.invoke(btDevice); return returnValue.booleanValue(); } static public boolean setPin(Class btClass, BluetoothDevice btDevice, String str) throws Exception { try { Method removeBondMethod = btClass.getDeclaredMethod("setPin", new Class[] {byte[].class}); Boolean returnValue = (Boolean) removeBondMethod.invoke(btDevice, new Object[] {str.getBytes()}); Log.e("returnValue", "" + returnValue); } catch (SecurityException e) { // throw new RuntimeException(e.getMessage()); e.printStackTrace(); } catch (IllegalArgumentException e) { // throw new RuntimeException(e.getMessage()); e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return true; } // 取消用户输入 static public boolean cancelPairingUserInput(Class btClass, BluetoothDevice device) throws Exception { Method createBondMethod = btClass.getMethod("cancelPairingUserInput"); // cancelBondProcess() Boolean returnValue = (Boolean) createBondMethod.invoke(device); return returnValue.booleanValue(); } // 取消配对 static public boolean cancelBondProcess(Class btClass, BluetoothDevice device) throws Exception { Method createBondMethod = btClass.getMethod("cancelBondProcess"); Boolean returnValue = (Boolean) createBondMethod.invoke(device); return returnValue.booleanValue(); } /** * * @param clsShow */ static public void printAllInform(Class clsShow) { try { // 取得所有方法 Method[] hideMethod = clsShow.getMethods(); int i = 0; for (; i < hideMethod.length; i++) { Log.e("method name", hideMethod[i].getName() + ";and the i is:" + i); } // 取得所有常量 Field[] allFields = clsShow.getFields(); for (i = 0; i < allFields.length; i++) { Log.e("Field name", allFields[i].getName()); } } catch (SecurityException e) { // throw new RuntimeException(e.getMessage()); e.printStackTrace(); } catch (IllegalArgumentException e) { // throw new RuntimeException(e.getMessage()); e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 最后就是MainActivity,用一个按钮来实现自动配对,代码如下: package com.itme.ActivityClass; import android.app.Activity; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import com.imte.utils.ClsUtils; public class MainActivity extends Activity implements OnClickListener{ /** Called when the activity is first created. */ private static BluetoothDevice remoteDevice=null; private Button btn_autopair=null; final static String ACTION_BLUETOOTHBC="android.bluetooth.device.action.PAIRING_REQUEST"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btn_autopair=(Button)findViewById(R.id.btn_autopair); btn_autopair.setOnClickListener(this); } public static boolean pair(String strAddr, String strPsw) { boolean result = false; //蓝牙设备适配器 BluetoothAdapter bluetoothAdapter = BluetoothAdapter .getDefaultAdapter(); //取消发现当前设备的过程 bluetoothAdapter.cancelDiscovery(); if (!bluetoothAdapter.isEnabled()) { bluetoothAdapter.enable(); } if (!BluetoothAdapter.checkBluetoothAddress(strAddr)) { // 检查蓝牙地址是否有效 Log.d("mylog", "devAdd un effient!"); } //由蓝牙设备地址获得另一蓝牙设备对象 BluetoothDevice device = bluetoothAdapter.getRemoteDevice(strAddr); if (device.getBondState() != BluetoothDevice.BOND_BONDED) { try { Log.d("mylog", "NOT BOND_BONDED"); ClsUtils.setPin(device.getClass(), device, strPsw); // 手机和蓝牙采集的装置配对 ClsUtils.createBond(device.getClass(), device); // ClsUtils.cancelPairingUserInput(device.getClass(), device); remoteDevice = device; // 配对完毕就把这个设备对象传给全局的remoteDevice result = true; } catch (Exception e) { // TODO Auto-generated catch block Log.d("mylog", "setPiN failed!"); e.printStackTrace(); } // } else { Log.d("mylog", "HAS BOND_BONDED"); try { //ClsUtils这个类的的以下静态方法都是通过反射机制得到需要的方法 ClsUtils.createBond(device.getClass(), device);//创建绑定 ClsUtils.setPin(device.getClass(), device, strPsw); // 手机和蓝牙的装置配对 ClsUtils.createBond(device.getClass(), device); // ClsUtils.cancelPairingUserInput(device.getClass(), device); remoteDevice = device; // 如果绑定成功,就直接把这个设备对象传给全局的remoteDevice result = true; } catch (Exception e) { // TODO Auto-generated catch block Log.d("mylog", "setPiN failed!"); e.printStackTrace(); } } return result; } @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.btn_autopair: if (pair("94:DB:46:2B:A1:82", "123456")) {//pair的第一个参数是要配对的蓝牙地址,第二个参数是配对时预先设置的密钥 Log.i("aaron", remoteDevice.getAddress()); } break; default: break; } } } 叮咚..如题的功能就实现了。。。 项目源代码下载地址: http://download.csdn.net/detail/huangrangg12/4578242
-
2021-05-26 07:33:10
Android系统下蓝牙自动配对连接方法
【专利摘要】本发明涉及一种Android系统下蓝牙自动配对连接方法,其包括如下步骤:步骤1、在Android设备端内存储上次进行蓝牙连接蓝牙外设的蓝牙地址,并存储已配对蓝牙外设的蓝牙地址以及对应的配对密钥;步骤2、在接收到蓝牙外设的连接请求时,Android设备端确定蓝牙外设的蓝牙地址,若与上次连接蓝牙外设的蓝牙地址对应时,将确定蓝牙外设的蓝牙地址与已配对蓝牙外设的蓝牙地址进行比对;步骤3、若确定蓝牙外设的蓝牙地址与已配对蓝牙外设的蓝牙地址相一致时,则直接蓝牙连接,否则,跳转至步骤4;步骤4、取出对应的配对密钥,并根据配对密钥与蓝牙外设的蓝牙连接。本发明能有效减少用户操作次数,提高易用性以及用户体验。
【专利说明】
Andro id系统下蓝牙自动配对连接方法
技术领域
[0001]本发明涉及一种连接方法,尤其是一种Android系统下蓝牙自动配对连接方法,属于蓝牙配对的技术领域。
【背景技术】
[0002]随着物联网的不断发展,智能手机的大范围普及。越来越多的智能终端需要通过蓝牙与智能手机建立连接,例如智能手环等。但是Android系统默认情况下与蓝牙外设建立连接的过程如下:首先打开设备的蓝牙,然后进行蓝牙扫描,扫描到的设备以列表形式呈现给用户。用户选择其中需要连接的设备,如果该设备是未配对的设备需要先进行配对,然后才能连接成功;如果该设备是已经配对的设备则会直接连接该设备。
[0003]但是用户大部分的使用场景是每次连接的时候需要连接的是上次连接过的设备,但是依然要进行扫描、主动连接的过程,这样大大降低了用户体验。
【发明内容】
[0004]本发明的目的是克服现有技术中存在的不足,提供一种Android系统下蓝牙自动配对连接方法,其能有效减少用户操作次数,提高了产品的易用性以及用户体验。
[0005]按照本发明提供的技术方案,一种Android系统下蓝牙自动配对连接方法,包括Android设备端以及能与所述Android设备端进行蓝牙连接的蓝牙外设;所述蓝牙自动配对连接方法包括如下步骤:
步骤1、在Android设备端内存储与所述Android设备端上次进行蓝牙连接蓝牙外设的蓝牙地址,并在所述Android设备端内存储已配对蓝牙外设的蓝牙地址以及对应的配对密钥;开启Android设备端的蓝牙,以使得所述An droid设备端能接收蓝牙外设发射的连接请求;
步骤2、Android设备端接收到蓝牙外设的连接请求时,Android设备端确定蓝牙外设的蓝牙地址,若所确定蓝牙外设的蓝牙地址与上次连接蓝牙外设的蓝牙地址对应时,Android设备端将确定蓝牙外设的蓝牙地址与所述Android设备端内已配对蓝牙外设的蓝牙地址进行比对;
步骤3、若确定蓝牙外设的蓝牙地址与已配对蓝牙外设的蓝牙地址相一致时,则Android设备端与所述蓝牙外设直接蓝牙连接,否则,跳转至步骤4;
步骤4、Android设备端根据确定蓝牙外设的蓝牙地址取出对应的配对密钥,并根据所述配对密钥与所述蓝牙外设的蓝牙连接。
[0006]所述Android设备端包括Android智能终端。
[0007]本发明的优点:可以有效减少用户操作的次数,尤其是对已连接过的蓝牙外设,同时也可以实现用户第一次连接新的蓝牙外设时,通过预设的蓝牙配对密钥以及将要连接蓝牙外设的蓝牙地址实现自动配对连接,最大程度上减少了用户操作的次数,提高了产品的易用性以及用户体验。
【附图说明】
[0008]图1为本发明的流程图。
【具体实施方式】
[0009]下面结合具体附图和实施例对本发明作进一步说明。
[0010]如图1所示:为了能有效减少用户操作次数,提高了产品的易用性以及用户体验,本发明包括Android设备端以及能与所述Android设备端进行蓝牙连接的蓝牙外设;所述蓝牙自动配对连接方法包括如下步骤:
步骤1、在Android设备端内存储与所述Android设备端上次进行蓝牙连接蓝牙外设的蓝牙地址,并在所述Android设备端内存储已配对蓝牙外设的蓝牙地址以及对应的配对密钥;开启Android设备端的蓝牙,以使得所述An droid设备端能接收蓝牙外设发射的连接请求;
具体地,Android设备端可以为现有常用的智能终端,如智能手机、智能平板等硬件设备,开启Android设备端蓝牙的过程为本技术领域人员所熟知,开启Android设备端的蓝牙后,Android设备端能接收蓝牙外设的连接请求,蓝牙外设可以为现有常用的外设,如智能手机、手环等,具体为本技术领域人员所熟知。对与Android设备成功进行蓝牙连接的蓝牙外设,在Android设备端存储上次连接蓝牙外设的蓝牙地址,以及已配对蓝牙外设的蓝牙地址与配对密钥,蓝牙地址与配对密钥间相关存储,具体过程为本技术领域人员所熟知,此处不再赘述。
[0011 ] 步骤2、Android设备端接收到蓝牙外设的连接请求时,Android设备端确定蓝牙外设的蓝牙地址,若所确定蓝牙外设的蓝牙地址与上次连接蓝牙外设的蓝牙地址对应时,Android设备端将确定蓝牙外设的蓝牙地址与所述Android设备端内已配对蓝牙外设的蓝牙地址进行比对;
本发明实施例中,在接收到蓝牙外设的连接请求后,Android设备端确定蓝牙外设的蓝牙地址的过程为本技术领域人员所熟知。若确定蓝牙外设的蓝牙地址与上次连接蓝牙外设的蓝牙地址对应时,则说明当前连接请求的蓝牙外设与Android设备端成功连接过,此时,根据Android设备端将确定蓝牙外设的蓝牙地址与所述Android设备端内已配对蓝牙外设的蓝牙地址进行比对进行后续的连接操作。
[0012]步骤3、若确定蓝牙外设的蓝牙地址与已配对蓝牙外设的蓝牙地址相一致时,则Android设备端与所述蓝牙外设直接蓝牙连接,否则,跳转至步骤4;
本发明实施例中,若确定蓝牙外设的蓝牙地址与已配对蓝牙外设的蓝牙地址相一致时,则说明当前请求连接的蓝牙外设是已配对的蓝牙外设,Android设备端与蓝牙外设直接连接即可。
[0013]步骤4、Android设备端根据确定蓝牙外设的蓝牙地址取出对应的配对密钥,并根据所述配对密钥与所述蓝牙外设的蓝牙连接。
[0014]本发明实施例中,如果在已配对的蓝牙地址中不存在与当前请求连接蓝牙外设的蓝牙设备地址相一致的情况,说明可能蓝牙外设的连接已经被手动取消配对,需要重新配对。此时Android设备端取出配对密钥,然后对上次连接过的蓝牙设备地址进行自动配对连接。
[0015]具体实施时,如果步骤4中自动配对连接失败,则说明可能用户已经更换需要连接的蓝牙外设或者被连接的蓝牙外设没有开启或者不在连接范围内,此时Android设备端执行正常的蓝牙连接流程:先扫描,然后把扫描到的设备列表呈现给用户,由用户选择需要连接的蓝牙外设,如果用户选择的蓝牙外设已经配对,则直接连接并更新Android设备端存储的上次连接的蓝牙地址为该蓝牙外设的蓝牙地址;如果用户选择的蓝牙外设没有配对则有用户手动配对、连接并更新Android设备端的设备密钥以及用户上次连接的蓝牙地址。本发明实施例中,在进行蓝牙自动配对连接时,会阻止配对密钥输入框的弹出。
[0016]本发明可以有效减少用户操作的次数,尤其是对已连接过的蓝牙外设,同时也可以实现用户第一次连接新的蓝牙外设时,通过预设的蓝牙配对密钥以及将要连接蓝牙外设的蓝牙地址实现自动配对连接,最大程度上减少了用户操作的次数,提高了产品的易用性以及用户体验。
【主权项】
1.一种Android系统下蓝牙自动配对连接方法,包括Android设备端以及能与所述Android设备端进行蓝牙连接的蓝牙外设;其特征是,所述蓝牙自动配对连接方法包括如下步骤: 步骤1、在Android设备端内存储与所述Android设备端上次进行蓝牙连接蓝牙外设的蓝牙地址,并在所述Android设备端内存储已配对蓝牙外设的蓝牙地址以及对应的配对密钥;开启Android设备端的蓝牙,以使得所述An droid设备端能接收蓝牙外设发射的连接请求; 步骤2、Android设备端接收到蓝牙外设的连接请求时,Android设备端确定蓝牙外设的蓝牙地址,若所确定蓝牙外设的蓝牙地址与上次连接蓝牙外设的蓝牙地址对应时,Android设备端将确定蓝牙外设的蓝牙地址与所述Android设备端内已配对蓝牙外设的蓝牙地址进行比对; 步骤3、若确定蓝牙外设的蓝牙地址与已配对蓝牙外设的蓝牙地址相一致时,则Android设备端与所述蓝牙外设直接蓝牙连接,否则,跳转至步骤4; 步骤4、Android设备端根据确定蓝牙外设的蓝牙地址取出对应的配对密钥,并根据所述配对密钥与所述蓝牙外设的蓝牙连接。2.根据权利要求1所述的Android系统下蓝牙自动配对连接方法,其特征是:所述Android设备端包括Android智能终端。
【文档编号】H04W76/02GK105933987SQ201610269581
【公开日】2016年9月7日
【申请日】2016年4月27日
【发明人】刘晓哲, 张海英, 胡冰
【申请人】江苏物联网研究发展中心
更多相关内容 -
蓝牙自动配对连接通信
2020-09-24 17:44:11Android蓝牙自动配对demo,如果需要手动配对修改一下socket获取方式,代码中是不用配对就可连接通信 -
android 蓝牙自动配对 无需手动输入
2014-01-26 13:25:10这个demo 是用来 自动配对蓝牙打印机 无需手动输入配对码,隐藏配对框,因为打印机配对码是已知“0000”,我在代码写死了,要自动配对要写入相对应的配对码。 这个demo 是 sdk android 2.1 上做的。 下载的朋友可以... -
Android 取消蓝牙配对框实现自动配对功能
2020-08-31 10:26:03主要介绍了Android 取消蓝牙配对框实现自动配对功能,非常不错,具有参考借鉴价值,需要的朋友可以参考下 -
android手机蓝牙自动配对,连接,互发消息
2017-01-13 15:09:412.另一台手机运行程序后选择客户端,自动搜索选择了服务端的手机,进行自动配对(手机与手机的配对需要人工确认),并自动连接。这时在两台手机上均可看见连接成功,然后可以互发消息进行聊天 3.程序退出后自动关闭... -
蓝牙自动配对怎么实现
2019-09-07 22:49:53明年就要毕业了,所以最近开始刷面试题,碰到了一个问题“蓝牙自动配对怎么实现的?”,刚开始有点懵逼了。于是学习一波,记录下来。 1 实现过程及原理 配对是建立连接的基础,任何从未配对过的设备(或曾经...明年就要毕业了,所以最近开始刷面试题,碰到了一个问题“蓝牙自动配对怎么实现的?”,刚开始有点懵逼了。于是学习一波,记录下来。
1 实现过程及原理
配对是建立连接的基础,任何从未配对过的设备(或曾经配对但其中一方已删除配对关系)都无法建立连接,因此配对无法绕过。配对的方式有输入pin码、输入密码、免输入的随机验证码等多种。当前XX设备与控制端的配对方式为免输入的随机验证码,两端确认6位数密码一致,点击“确认配对”即可完成配对。但由于XX设备无法用户交互,所以只能由程序完成确认实现自动配对——当然,XX设备只针对确定来源的请求(如XX助手)才默认同意并接受配对。
2 查找设备的方式
蓝牙开启后查找设备的方式有两种:搜索和指定mac,用搜索功能查找蓝牙设备涉及“可见性”的概念,蓝牙对外可见(即能被别的蓝牙设备搜索到)最多可设置为300s(5分钟),而指定的mac方式没有时间限制,只要蓝牙开启就可以找到设备,因为XX设备与控制端需要随时能(配对)连接,显然搜索查找的方式,不适用于XX设备。因此只能选择指定mac地址的方式。
3 相关代码实现
3.1 注册权限
因为需要实现蓝牙配对,所以需要开启蓝牙相关的权限,在Android的清单文件中申请如下权限:
<uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED" /> <uses-permission android:name="android.permission.ACCESS_BLUETOOTH_SHARE" />
3.2 注册广播
BoradcastReceiver(想更了解百度)在Android中充当的是传递数据和消息的作用。所以这是实现蓝牙自动配置的关键。其注册方式分为静态注册和动态注册。
3.2.1 动态注册
动态注册就是采用activity内部实现广播类,采用java代码的方式实现,相关代码如下:
// 注册Receiver来获取蓝牙设备相关的结果(主要逻辑是第一行和最后一行代码) IntentFilter intent = new IntentFilter(); // 用BroadcastReceiver来取得搜索结果 intent.addAction(BluetoothDevice.ACTION_FOUND); intent.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED); intent.addAction(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED); intent.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); // searchDevices表示广播类,详细了解百度 registerReceiver(searchDevices, intent);
注:动态配置结尾必须在Activity中的生命周期函数onDestroy()中调用销毁广播逻辑,代码为:this.unregisterReceiver(searchDevices);
3.2.2 静态注册
静态注册就是把广播类注册到清单文件中,写个广播类,之后在清单文件中填写相关代码,代码如下:
// 类地址 <receiver android:name=".broadcast.BluetoothReceiver" > <intent-filter android:priority="1000"> // 详细了解百度 <action android:name="android.bluetooth.device.action.PAIRING_REQUEST"/> <action android:name="android.bluetooth.device.action.FOUND"/> </intent-filter> </receiver>
注:idea中我一般直接可以新建一个广播类,也不用填写上面代码,但是你配置更详细一些需要添加action节点。
3.3 配对逻辑
在广播中的广播接收回调函数onReceive()实现配对逻辑,这里建议跳转阅读一下BluetoothAdapter的API使用,文章时间可能有点老,但是非常全面,其相关代码如下:
// 我这里没有代码重构,我看一下,网上都把其操作逻辑封装在工具类中。 @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); Bundle b = intent.getExtras(); Object[] lstName = b.keySet().toArray(); // 显示所有收到的消息及其细节 for (int i = 0; i < lstName.length; i++) { String keyName = lstName[i].toString(); Log.e(keyName, String.valueOf(b.get(keyName))); } BluetoothDevice device = null; // 搜索设备时,取得设备的MAC地址 if (BluetoothDevice.ACTION_FOUND.equals(action)) { device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); if (device.getBondState() == BluetoothDevice.BOND_NONE) { String str = "未配对|" + device.getName() + "|" + device.getAddress(); if (lstDevices.indexOf(str) == -1)// 防止重复添加 { lstDevices.add(str); } // 获取设备名称和mac地址 adtDevices.notifyDataSetChanged(); } }else if(BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)){ device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); switch (device.getBondState()) { case BluetoothDevice.BOND_BONDING: Log.d("BlueToothTestActivity", "正在配对......"); break; case BluetoothDevice.BOND_BONDED: Log.d("BlueToothTestActivity", "完成配对"); connect(device);//连接设备 break; case BluetoothDevice.BOND_NONE: Log.d("BlueToothTestActivity", "取消配对"); default: break; } } }
总结
以上写的是蓝牙自动配对的整个过程,是一个思路以及主要代码,但作为程序猿的我们理论上掌握肯定不行的。所以我会上传两个demo(分别代表静态注册和动态注册)。有问题大家一起探头。@1797801363@qq.com,qq也是这个哦。(要代码直接@我不需要积分的哦)。
-
Android 蓝牙 自动配对连接
2018-08-05 19:50:12最近在开发一个手机连接蓝牙设备的APP,其中有个需求是自动连接,用户不用确认。我在网上找到了一个工具类,但是网上很 多文章对这个工具类的使用方法都不能实现我的需求,要么弹出框不能隐藏,要么是隐藏输入框却...最近在开发一个手机连接蓝牙设备的APP,其中有个需求是自动连接,用户不用确认。我在网上找到了一个工具类,但是网上很
多文章对这个工具类的使用方法都不能实现我的需求,要么弹出框不能隐藏,要么是隐藏输入框却不能配对成功。经过我多次尝
试,发现他们的配对方法用错了。
工具类:ClsUtils.java
/**************** 蓝牙配对函数 ***************/ import java.lang.reflect.Field; import java.lang.reflect.Method; import android.bluetooth.BluetoothDevice; import android.util.Log; public class ClsUtils { /** * 与设备配对 参考源码:platform/packages/apps/Settings.git * /Settings/src/com/android/settings/bluetooth/CachedBluetoothDevice.java */ static public boolean createBond(Class btClass, BluetoothDevice btDevice) throws Exception { Method createBondMethod = btClass.getMethod("createBond"); Boolean returnValue = (Boolean) createBondMethod.invoke(btDevice); return returnValue.booleanValue(); } /** * 与设备解除配对 参考源码:platform/packages/apps/Settings.git * /Settings/src/com/android/settings/bluetooth/CachedBluetoothDevice.java */ static public boolean removeBond(Class<?> btClass, BluetoothDevice btDevice) throws Exception { Method removeBondMethod = btClass.getMethod("removeBond"); Boolean returnValue = (Boolean) removeBondMethod.invoke(btDevice); return returnValue.booleanValue(); } static public boolean setPin(Class<? extends BluetoothDevice> btClass, BluetoothDevice btDevice, String str) throws Exception { try { Method removeBondMethod = btClass.getDeclaredMethod("setPin", new Class[]{byte[].class}); Boolean returnValue = (Boolean) removeBondMethod.invoke(btDevice, new Object[]{str.getBytes()}); Log.e("returnValue", "" + returnValue); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return true; } // 取消用户输入 static public boolean cancelPairingUserInput(Class<?> btClass, BluetoothDevice device) throws Exception { Method createBondMethod = btClass.getMethod("cancelPairingUserInput"); Boolean returnValue = (Boolean) createBondMethod.invoke(device); return returnValue.booleanValue(); } // 取消配对 static public boolean cancelBondProcess(Class<?> btClass, BluetoothDevice device) throws Exception { Method createBondMethod = btClass.getMethod("cancelBondProcess"); Boolean returnValue = (Boolean) createBondMethod.invoke(device); return returnValue.booleanValue(); } //确认配对 static public void setPairingConfirmation(Class<?> btClass, BluetoothDevice device, boolean isConfirm) throws Exception { Method setPairingConfirmation = btClass.getDeclaredMethod("setPairingConfirmation", boolean.class); setPairingConfirmation.invoke(device, isConfirm); } /** * * @param clsShow */ static public void printAllInform(Class clsShow) { try { // 取得所有方法 Method[] hideMethod = clsShow.getMethods(); int i = 0; for (; i < hideMethod.length; i++) { Log.e("method name", hideMethod[i].getName() + ";and the i is:"+ i); } // 取得所有常量 Field[] allFields = clsShow.getFields(); for (i = 0; i < allFields.length; i++) { Log.e("Field name", allFields[i].getName()); } } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } }
实现的界面,没有采用在Manifest文件里配置receiver的方法,因为发现那样配置结果还是会闪出配对密码输入框,附配对代码
本方法是根据蓝牙名称进行配对的,如需求不同可以自己该代码,不适用配对手机蓝牙设备,只适用于硬件开发中蓝牙模块中需
要输入密码的配对,(layout文件里只有一个按钮,这里就不给代码了):
import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.Toast; public class MainActivity extends AppCompatActivity { private BluetoothAdapter bluetoothAdapter; private BluetoothDevice bluetoothDevice; private Button search; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //开始配对按钮 search = findViewById(R.id.search_bluetooth); bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); //检查蓝牙 if(bluetoothAdapter != null){ if(!bluetoothAdapter.isEnabled()){ Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); //设置蓝牙可见性 intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,3000); this.startActivity(intent); //打开蓝牙 bluetoothAdapter.enable(); } }else { Toast.makeText(this,"本地设备驱动异常",Toast.LENGTH_LONG).show(); } search.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //扫描设备 bluetoothAdapter.startDiscovery(); //注册广播 RegisterBluetoothReceiver(); } }); } //注册广播 public void RegisterBluetoothReceiver(){ // 设置广播信息过滤 IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(BluetoothDevice.ACTION_FOUND); intentFilter.addAction(BluetoothDevice.ACTION_PAIRING_REQUEST); // 注册广播接收器,接收并处理搜索结果 registerReceiver(BTReceive, intentFilter); } //处理蓝夜绑定的广播 private BroadcastReceiver BTReceive = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if(BluetoothDevice.ACTION_FOUND.equals(action)){ bluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); String bluetoothName; if((bluetoothName = bluetoothDevice.getName()) != null){ // 如果查找到的设备符合要连接的设备,处理 if (bluetoothName.equalsIgnoreCase("HC-05")) { //搜索蓝牙占用资源,搜索到后要及时关闭 bluetoothAdapter.cancelDiscovery(); //获取蓝牙的连接状态 int connectState = bluetoothDevice.getBondState(); switch (connectState){ //未配对 case BluetoothDevice.BOND_NONE: //开始配对 try{ ClsUtils.createBond(bluetoothDevice.getClass(),bluetoothDevice); }catch (Exception e){ e.printStackTrace(); } break; } } } }else if(BluetoothDevice.ACTION_PAIRING_REQUEST.equals(action)){ try { //如果不结束广播接收,配对界面会闪出 abortBroadcast(); //顺序一定要这样,否则会出问题 ClsUtils.setPin(bluetoothDevice.getClass(), bluetoothDevice, "1234"); //这行代码会在控制台报错 //ClsUtils.setPairingConfirmation(bluetoothDevice.getClass(), bluetoothDevice,true); }catch (Exception e){ e.printStackTrace(); } } } }; @Override protected void onDestroy() { super.onDestroy(); //注销广播 unregisterReceiver(BTReceive); } }
参考文章:https://blog.csdn.net/qq_30297763/article/details/79621137
-
android9.0修改系统源码之实现蓝牙自动配对
2019-08-08 16:42:38android9.0修改系统源码之实现蓝牙自动配对,不能出现弹框! -
android 蓝牙自动配对
2016-11-15 14:59:22亲测调试可用,没有扫描,主要是自动配对功能,无配对提示框 -
android 实现蓝牙自动配对连接
2019-01-11 08:59:00最后就是MainActivity,用一个按钮来实现自动配对,代码如下: package com.itme.ActivityClass; import android.app.Activity; import android.bluetooth.BluetoothAdapter; import android.bluetooth...转载于:https://my.oschina.net/u/920274/blog/2999998
-
Android蓝牙自动配对Demo,亲测好使!!!
2016-09-01 16:24:45蓝牙自动配对,即搜索到其它蓝牙设备之后直接进行配对,不需要弹出配对确认框或者密钥输入框。 经过最近一段时间得研究,针对网上给出的案例。总结了一个亲测好使的Demo。 -
Android蓝牙自动配对授权连接的实现方法
2020-10-29 11:46:28修改设置蓝牙配对相关源码packages/apps/Settings/src/com/android/settings/bluetooth/BluetoothPairingRequest.java 添加代码实现自动配对的过程: 添加变量 private static final int NOTIFICATION_ID = ... -
Android 蓝牙自动配对连接
2018-03-20 09:49:33蓝牙工具类: public class BTReceiverUtils { /** * 与设备配对 */ static public boolean createBond(Class btClass, BluetoothDevice btDevice) throws Exception { Method createBondMethod = b... -
Android蓝牙搜索自动配对通信Demo下载
2017-11-06 17:02:081、蓝牙自动配对,即搜索到其它蓝牙设备之后直接进行配对,不需要弹出配对确认框或者密钥输入框。 2、本Demo用来连接蓝牙设备Parking Locator,如果你要连接其他蓝牙设备,注意修改相关名字以及修改设备初试pin值。 -
Android蓝牙自动配对
2019-09-12 21:55:31Android蓝牙自动配对 蓝牙权限配置 <uses-permission android:name="android.permission.BLUETOOTH" > //使用蓝牙的权限 <uses-permission android:name="a... -
android手机蓝牙自动配对,连接,互发消息示例
2012-08-27 09:00:272.另一台手机运行程序后选择客户端,自动搜索选择了服务端的手机,进行自动配对(第一次手机之间的配对需要人工确认,后面不需要),并自动连接。这时在两台手机上均可看见连接成功,然后可以互发消息进行聊天 3.... -
BTMessenger:无需密码即可通过蓝牙自动配对两个安卓设备。 您可以在两台设备之间发送任何消息
2021-06-14 23:40:31BT信使 主要功能: 1 Pair two android devices via bluetooth automatically without passkey. 2 Send message between these two devices. 如何在 Android 设备上使用 BTMessenger: 1 Pair two devices via ... -
Android 蓝牙自动匹配PIN码跳过用户交互示例
2020-08-30 09:13:31本篇文章主要介绍了Android 蓝牙自动匹配PIN码跳过用户交互示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 -
android蓝牙自动配对
2013-11-29 22:09:04之前做的蓝牙自动配对,现在整理一下。免得忘记。 首页一定要注意权限问题 [html] view plaincopy uses-permission android:name="android.permission.BLUETOOTH" /> //使用蓝牙的... -
Android蓝牙自动配对和Pin码设置
2016-03-22 19:49:201、蓝牙设备之间自动配对,需要两个设备都安装进行配对的apk(网上好多自动配对的帖子都没有说明情况) 2、在自动匹配的时候想通过反射调用BluetoothDevice的setPin、createBond、cancelPairingUserInput实现设置... -
蓝牙bluetooth搜索并自动配对
2015-02-13 08:12:56蓝牙bluetooth搜索并自动配对,对于配置好的设备可进行自动连接 -
如何实现android蓝牙开发 自动配对连接,并不弹出提示框
2021-05-26 07:33:52之前做一个android版的蓝牙 与血压计通讯的项目,遇到最大的难题就是自动配对.上网查资料说是用反射createBond()和setPin(),但测试时进行配对还是会出现提示,但配对是成功了我就开始查找怎么关闭这个蓝牙配对提示... -
pi_bluetooth_auto_connect:设备附近时,将树莓派自动连接到蓝牙设备
2021-04-10 11:45:23pi_bluetooth_auto_connect 设备附近时,将树莓派自动连接到蓝牙设备 -
Android rom开发:修改Settings源码,支持蓝牙自动配对,无需输入PIN码
2022-04-08 17:07:45} else { + //屏蔽状态栏通知,直接跳转配对对话框 wjz@2022.3.28 + context.startActivityAsUser(pairingIntent, UserHandle.CURRENT); // Put up a notification that leads to the dialog - intent.setClass... -
Android 蓝牙连接,蓝牙配对,自动连接蓝牙
2022-03-23 17:38:01免费下载!Android蓝牙配对,开启关闭蓝牙,搜索附近蓝牙设备,代码如何使用介绍