文档章节

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

补全
 补全
发布于 2012/06/19 19:43
字数 747
阅读 22864
收藏 25

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

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

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

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

cancelBondProcess()和cancelPairingUserInput()

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

下面是自动配对的代码

Mainfest,xml注册

 

<receiver android:name=".BluetoothConnectActivityReceiver" >
    <intent-filter>
        <action android:name="android.bluetooth.device.action.PAIRING_REQUEST" />
    </intent-filter>
</receiver>

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

 

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


	}
}

 

<b>/************************************ 蓝牙配对函数 * **************/
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();
		}
	}
}</b>

 执行时直接使用:

 

<b>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;
	}</b>

© 著作权归作者所有

共有 人打赏支持
补全
粉丝 20
博文 27
码字总数 4103
作品 0
福州
高级程序员
私信 提问
加载中

评论(18)

androidzuo
androidzuo

引用来自“zhoulc”的评论

hi,你完成自动匹配的话需要两个设备都装上上面代码生成的apk吧。
是不是需要两个设备都装上apk?
b
biandan1231

引用来自“王伟1124”的评论

发现这个createRfcommSocketToServiceRecord(HM_MY_UUID);方法会要求配对,
createInsecureRfcommSocketToServiceRecord(HM_MY_UUID);不会要求配对,
说明我的单片机是不要求配对的,哈哈 这个简单,大家试一下.
不是每个蓝牙设备都有UUID的
涂晓涛
涂晓涛
你好,在反射调用setpin方法是 总返回的是false。是什么原因呢。
补全
补全

引用来自“王伟1124”的评论

发现这个createRfcommSocketToServiceRecord(HM_MY_UUID);方法会要求配对,
createInsecureRfcommSocketToServiceRecord(HM_MY_UUID);不会要求配对,
说明我的单片机是不要求配对的,哈哈 这个简单,大家试一下.

[79]

王伟1124
发现这个createRfcommSocketToServiceRecord(HM_MY_UUID);方法会要求配对,
createInsecureRfcommSocketToServiceRecord(HM_MY_UUID);不会要求配对,
说明我的单片机是不要求配对的,哈哈 这个简单,大家试一下.
王伟1124
发现这个createRfcommSocketToServiceRecord(HM_MY_UUID);方法会要求配对,
createInsecureRfcommSocketToServiceRecord(HM_MY_UUID);不会要求配对,
说明我的单片机是不要求配对的,哈哈 这个简单,大家试一下.
王伟1124
Android4.3上试验还会弹出配对输入对话框,等1秒左右会自动消失,然后配对也是成功了.
怎么样可以让它根本就不弹出呢?
f
fengtiaotiao
楼主,用你的代码还是会出来配对请求提示框的啊,倒是能自动配对的,那个提示框出来等会又自己消失,这个情况怎么解决啊?
f
fengtiaotiao

引用来自“ap0305131”的评论

用你的代码,发现根本就不是用预设的密码去配对的,还是系统的配对码,只不过有个输入框会自动消失,有时不消失

请问您解决蓝牙自动配对,不显示提示框的问题了吗?
补全
补全

引用来自“ap0305131”的评论

用你的代码,发现根本就不是用预设的密码去配对的,还是系统的配对码,只不过有个输入框会自动消失,有时不消失

是什么设备了 什么系统版本
android 蓝牙程序控制绑定与删除绑定

如何实现android蓝牙开发 自动配对连接,并不弹出提示框 (2013-01-05 15:27:36) 转载▼ 标签: 杂谈 分类: 转摘文章 我就开始查找怎么关闭这个蓝牙配对提示框,后面还是伟大的android源码帮助...

andyhe91
2014/08/06
0
1
如何实现android蓝牙开发 自动配对连接,并不弹出提示框

如何实现android蓝牙开发 自动配对连接,并不弹出提示框 之前做一个android版的蓝牙,遇到最大的难题就是自动配对. 上网查资料说是用反射createBond()和setPin(),但测试时进行配对还是会...

vga
2015/09/13
489
0
android 系统如何修改settings源码 取消蓝牙配对框 实现PIN自动配对

android 系统如何修改settings源码 取消蓝牙配对框 实现PIN自动配对 ,就是我们在新的设备上打开蓝牙设备时,当有设备请求时直接连接,不需要弹出配对PIN的对话框,望各位大师提提意见,不需...

陈大霖
2013/08/13
2K
3
android4.2.2 两台android设备蓝牙自动配对

使用网上反射setPin方法无法实现自动配对,配对不成功,且需要弹出配对确认框,而且弹出框里的pin值不是预设setPin里的pin值,好像4.0以上pin值是自动生成的随机数。 请问如何在两台android...

剑钧
2013/09/10
479
1
Android蓝牙开发—经典蓝牙详细开发流程

Android蓝牙开发前,首先要区分是经典蓝牙开发还是BLE(低功耗)蓝牙开发,它们的开发是有区别的,如果还分不清经典蓝牙和BLE(低功耗)蓝牙的小伙伴,可以先看Android蓝牙开发—经典蓝牙和B...

天王盖地虎626
01/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Visual Studio 2017对xp的支持

等待VS2017安装程序配置结束会,会出现VS2017安装组件和工具配置界面,勾选工作负载左侧的“使用C++的桌面开发”组件和右侧的“对C++的Windows XP支持”、“MFC和ALT支持(x86和x64)”和“I...

simpower
29分钟前
0
0
VMware vSphere 服务器虚拟化部署安装图解

转载来源 :talkwithtrend :https://mp.weixin.qq.com/s/OJUINggNmiasooXDykHkow 一、VMware vSphere部署的前期规划要点 1、如何利用现在的设备架构虚拟化环境 在虚拟化过程中,用户大多会考...

寰宇01
29分钟前
2
0
mysql图表统计,补全日期

SELECT od.date, SUM(od.money)FROM ( SELECT SUM(money) money, DATE_FORMAT(create_time, '%Y-%m-%d') date FROM ......

时刻在奔跑
29分钟前
2
0
判断某一日期在另外一个日期之前

1.调用方式 oneDate.compareTo(anotherDate); 2.函数源码 /** * Compares two Dates for ordering. * * @param anotherDate the <code>Date</code> to be compared.......

hengbao5
47分钟前
1
0
docker 容器开发

package mainimport ("fmt""log""os""os/exec""syscall")/*func main(){cmd:= exec.Command("sh")cmd.SysProcAttr=&syscall.SysProcAttr{Cloneflags:sys......

whhbb
48分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部