之前做一个android版的蓝牙 与血压计通讯的项目,遇到最大的难题就是自动配对.

上网查资料说是用反射createBond()和setPin(),但测试时进行配对还是会出现提示,但配对是成功了

我就开始查找怎么关闭这个蓝牙配对提示框,后面还是伟大的android源码帮助了我。

在源码 BluetoothDevice 类中还有两个隐藏方法

cancelBondProcess()和cancelPairingUserInput()

这两个方法一个是取消配对进程一个是取消用户输入

下面是自动配对的代码

Mainfest,xml注册

自己在收到广播时处理并将预先输入的密码设置进去

public class BluetoothConnectActivityReceiver extends BroadcastReceiver

{

String strPsw = "0";

@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);

// byte[] pinBytes = BluetoothDevice.convertPinToBytes("1234");

// device.setPin(pinBytes);

Log.i("tag11111", "ddd");

try

{

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

ClsUtils.createBond(btDevice.getClass(), btDevice);

ClsUtils.cancelPairingUserInput(btDevice.getClass(), btDevice);

}

catch (Exception e)

{

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

/************************************ 蓝牙配对函数 * **************/

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();

}

}

}

执行时直接使用:

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);

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.createBond(device.getClass(), device);

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

ClsUtils.createBond(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;

}

来源:oschina

链接:https://my.oschina.net/u/106603/blog/62975

android 提示蓝牙无法配对,如何实现android蓝牙开发 自动配对连接,并不弹出提示框...相关推荐

  1. 蓝牙连接每次弹出确认框问题的排查及解决

    一周前客户提交了一个Bug. 具体的问题是这样的, 客户的一台设备坏了, 临时换了一台设备后发现,新换的设备不像老设备那样每次进行蓝牙连接时都提示要确认配对.这个问题确实是不对比不知道,一直以来谁都没 ...

  2. android蓝牙配对 自动联接,如何实现android蓝牙开发 自动配对连接,并不弹出提示框...

    之前做一个android版的蓝牙 与血压计通讯的项目,遇到最大的难题就是自动配对. 上网查资料说是用反射createBond()和setPin(),但测试时进行配对还是会出现提示,但配对是成功了 我就 ...

  3. Android开发- 点击按钮旁弹出选择框

    示例: 一.代码部分: 1.弹出框页面布局(layout/pop_mesure_layout.xml) <!--LinearLayout不能设置背景颜色--> <LinearLayo ...

  4. 双击SDK Manager.exe和AVD Manager.exe时,弹出提示:failed to execute tools\android.bat解决办法

    在Android的虚拟机上出现"no target selected",去android-sdk-windows里面双击SDK Manager.exe和AVD Manager.ex ...

  5. Android实现Mtp访问浏览手机存储(二) 禁止DocumentsUI文件直接弹出

    Android实现Mtp访问浏览手机存储(一)访问Mtp目录 Android实现Mtp访问浏览手机存储(二) 禁止DocumentsUI文件直接弹出 当usb接入时,默认打开系统的DocumentUI ...

  6. Android弹出选项框及指示箭头动画选择

     Android弹出选项框及指示箭头动画选择 Android原生的Spinner提供了下拉列表选项框,但在一些流行的APP中,原生的Spinner似乎不太受待见,而通常会有下图所示的下拉列表选项框 ...

  7. android 加号弹出菜单,Android仿微信、qq点击右上角加号弹出操作框

    Android仿微信.qq点击右上角加号弹出操作框,先上图,类似于下图这种,点击加号,会弹出一个对话框,如下图: 微信: 自己实现: 接下来,我们来实现此功能: 其实,实现原理就是,点击"+ ...

  8. Android自定义弹窗模仿微信,Android仿微信、qq点击右上角加号弹出操作框

    Android仿微信.qq点击右上角加号弹出操作框,先上图,类似于下图这种,点击加号,会弹出一个对话框,如下图: 微信: 自己实现: 接下来,我们来实现此功能: 其实,实现原理就是,点击"+ ...

  9. qtreeview 点击二级节点弹出dialog_Flutter Toast、弹出提示、轻提示

    主流的三种APP反馈形式: toast.snackbar以及dialog. toast通常用于提示用户一些不那么重要的信息, 会弹出并显示文字一段时间. 时间一到就会消失. 相较于snackbar和d ...

最新文章

  1. 应用程序下载地址汇总
  2. 实验一HSRP与STP结合
  3. 亲测可用的github只下载一个文件夹的方法
  4. “我是技术总监,你干嘛总问我技术细节?”| 程序员有话说
  5. 【Luogu3383】【模板】线性筛素数
  6. Redhat安装tftp的方法
  7. http --- cookie与会话跟踪
  8. C语言程序返回值为int的时候,不同值代表不同的意义
  9. android如何使用BroadcastReceiver后台实现来电通话记录的监听并存取到sqllite数据库通过Contentprovilder实现接口...
  10. 【读书笔记】—— 《从 0 到 1》
  11. Leetcode 79.单词搜索
  12. flash幻灯片源码
  13. 城建坐标与经纬度转换工具
  14. micro usb接口定义图
  15. [BZOJ5332] [SDOI2018] 旧试题 [BZOJ5276] Skyfall [莫比乌斯反演][三元环计数][std::vector][Cache Miss]
  16. 整理了上千个Python类库,简直太酷啦!
  17. 丁磊:求快是创业者的思维误区,过于强调时间窗口也是一个伪命题
  18. 计算机图形学流体仿真mac网格,用于图形学的流体仿真20教程.docx
  19. 数据中心机房温湿度监测
  20. Linux下怎么进入波浪线目录,linux 波浪线 ~ 使用方法

热门文章

  1. 在EDIUS 8中如何给图片进行描边
  2. 男人与女人之间灰常有趣的35条定律,太精辟鸟!
  3. Redis高级项目实战,适合java开发的笔记本电脑
  4. 半夜电脑屏幕亮起终于解决了! window10 睡眠后一段时间自动唤起的解决办法
  5. Web前端自学之路学习路线,web前端开发网站
  6. 关于个体工商户的15个财税要点,你清楚吗?
  7. Linux中 mv(文件移动)
  8. 九宫格穷举所有解——九宫Killer
  9. 森鹰窗业通过创业板注册:年营收9.57亿 应收账款达2.7亿
  10. springboot处理xlsx或xls表格文件