如何实现android蓝牙配对连接自动配对连接

Android连接蓝牙设备一般有这几个步奏
1、注册蓝牙相关的广播
IntentFilter intent = new IntentFilter()
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)
registerReceiver(searchDevices, intent)
2、搜索蓝牙设备
BluetoothAdapter.getDefaultAdapter().startDiscovery()
btDev.createBond()
4、建立连接
private void connect(BluetoothDevice btDev) {
UUID uuid = UUID.fromString(SPP_UUID);
btSocket =(BluetoothSocket) btDev.getClass().getMethod("createRfcommSocket", new Class[] {int.class}).invoke(btDev,1);
Log.d("BlueToothTestActivity", "开始连接...");
btSocket.connect();
} catch (IOException e) {
Log.e("BlueToothTestActivity", "开始连接......链接失败");
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
此处不抛出异常即可连接成功
完整代码:
package com.example.bluetoothtest
import java.io.IOException
import java.lang.reflect.InvocationTargetException
import java.util.ArrayList
import java.util.List
import java.util.UUID
import android.annotation.SuppressLint
import android.app.Activity
import android.bluetooth.BluetoothAdapter
import android.bluetooth.BluetoothDevice
import android.bluetooth.BluetoothSocket
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.Button
import android.widget.ListView
import android.widget.Toast
import android.widget.ToggleButton
public class BlueToothTestActivity extends Activity {
//该UUID表示串口服务
static final String SPP_UUID = "0-805F9B34FB"
Button btnSearch, btnDis, btnExit,spilt
ToggleButton tbtnSwitch
ListView lvBTDevices
ArrayAdapter&String& adtDevices
List&String& lstDevices = new ArrayList&String&()
BluetoothAdapter btAdapt
public static BluetoothSocket btSocket
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState)
if (VERSION.SDK_INT &= VERSION_CODES.KITKAT) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION)
setContentView(R.layout.activity_main)
// Button 设置
btnSearch = (Button) this.findViewById(R.id.btnSearch)
btnSearch.setOnClickListener(new ClickEvent())
btnExit = (Button) this.findViewById(R.id.btnExit)
btnExit.setOnClickListener(new ClickEvent())
btnDis = (Button) this.findViewById(R.id.btnDis)
btnDis.setOnClickListener(new ClickEvent())
// ToogleButton设置
tbtnSwitch = (ToggleButton) this.findViewById(R.id.tbtnSwitch)
tbtnSwitch.setOnClickListener(new ClickEvent())
spilt = (Button)this.findViewById(R.id.spilt)
spilt.setOnClickListener(new ClickEvent())
// ListView及其数据源 适配器
lvBTDevices = (ListView) this.findViewById(R.id.lvDevices)
adtDevices = new ArrayAdapter&String&(this,
android.R.layout.simple_list_item_1, lstDevices)
lvBTDevices.setAdapter(adtDevices)
lvBTDevices.setOnItemClickListener(new ItemClickEvent())
btAdapt = BluetoothAdapter.getDefaultAdapter()
if (btAdapt.isEnabled()) {
tbtnSwitch.setChecked(false)
tbtnSwitch.setChecked(true)
// ============================================================
// 注册Receiver来获取蓝牙设备相关的结果
IntentFilter intent = new IntentFilter()
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)
registerReceiver(searchDevices, intent)
private BroadcastReceiver searchDevices = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction()
Bundle b = intent.getExtras()
Object[] lstName = b.keySet().toArray()
// 显示所有收到的消息及其细节
for (int i = 0
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)
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", "正在配对......")
case BluetoothDevice.BOND_BONDED:
Log.d("BlueToothTestActivity", "完成配对")
connect(device)
case BluetoothDevice.BOND_NONE:
Log.d("BlueToothTestActivity", "取消配对")
protected void onDestroy() {
this.unregisterReceiver(searchDevices)
super.onDestroy()
android.os.Process.killProcess(android.os.Process.myPid())
class ItemClickEvent implements AdapterView.OnItemClickListener {
@SuppressLint("NewApi") @Override
public void onItemClick(AdapterView&?& arg0, View arg1, int arg2,
long arg3) {
if(btAdapt.isDiscovering())btAdapt.cancelDiscovery()
String str = lstDevices.get(arg2)
String[] values = str.split("\\|")
String address = values[2]
Log.e("BlueToothTestActivity", "address :"+values[2])
BluetoothDevice btDev = btAdapt.getRemoteDevice(address)
Boolean returnValue = false
if (btDev.getBondState() == BluetoothDevice.BOND_NONE) {
btDev.createBond()
}else if(btDev.getBondState() == BluetoothDevice.BOND_BONDED){
connect(btDev)
} catch (Exception e) {
e.printStackTrace()
private void connect(BluetoothDevice btDev) {
UUID uuid = UUID.fromString(SPP_UUID)
// btSocket = btDev.createRfcommSocketToServiceRecord(uuid)
btSocket =(BluetoothSocket) btDev.getClass().getMethod("createRfcommSocket", new Class[] {int.class}).invoke(btDev,1)
Log.d("BlueToothTestActivity", "开始连接...")
btSocket.connect()
} catch (IOException e) {
// TODO Auto-generated catch block
Log.e("BlueToothTestActivity", "开始连接......链接失败")
e.printStackTrace()
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace()
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace()
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace()
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace()
class ClickEvent implements View.OnClickListener {
public void onClick(View v) {
if (v == btnSearch)// 搜索蓝牙设备,在BroadcastReceiver显示结果
if (btAdapt.getState() == BluetoothAdapter.STATE_OFF) {// 如果蓝牙还没开启
Toast.makeText(BlueToothTestActivity.this, "请先打开蓝牙", 1000)
if (btAdapt.isDiscovering())
btAdapt.cancelDiscovery()
lstDevices.clear()
Object[] lstDevice = btAdapt.getBondedDevices().toArray()
for (int i = 0
BluetoothDevice device = (BluetoothDevice) lstDevice[i]
String str = "已配对|" + device.getName() + "|"
+ device.getAddress()
lstDevices.add(str)
adtDevices.notifyDataSetChanged()
setTitle("本机蓝牙地址:" + btAdapt.getAddress())
btAdapt.startDiscovery()
} else if (v == tbtnSwitch) {// 本机蓝牙启动/关闭
if (tbtnSwitch.isChecked() == false)
btAdapt.enable()
else if (tbtnSwitch.isChecked() == true)
btAdapt.disable()
} else if (v == btnDis)// 本机可以被搜索
Intent discoverableIntent = new Intent(
BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE)
discoverableIntent.putExtra(
BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300)
startActivity(discoverableIntent)
} else if (v == btnExit) {
if (btSocket != null)
btSocket.close()
} catch (IOException e) {
e.printStackTrace()
BlueToothTestActivity.this.finish()
private void autoConnect(String address){
if(btAdapt.isDiscovering())btAdapt.cancelDiscovery()
BluetoothDevice btDev = btAdapt.getRemoteDevice(address)
if (btDev.getBondState() == BluetoothDevice.BOND_NONE) {
btDev.createBond()
}else if(btDev.getBondState() == BluetoothDevice.BOND_BONDED){
connect(btDev)
} catch (Exception e) {
e.printStackTrace()
自动连接就只需要调用autoConnect(String address),具体的address就在BluetoothDevice.ACTION_FOUND广播中获取的。
本文已收录于以下专栏:
相关文章推荐
蓝牙自动配对,即搜索到其它蓝牙设备之后直接进行配对,不需要弹出配对确认框或者密钥输入框。
经过最近一段时间得研究,针对网上给出的案例。总结了一个亲测好使的Demo。
不亦喜欢探讨技术,软硬件都玩,欢迎五湖四海的兄弟姐妹在此留言交流,正常情况每天都会查看 :)
没有永远的大佬,只有暂时的菜鸟~
前言(android2.3版本,4.0版本由于是随机获取pin值,没有研究过):
1、蓝牙设备之间自动配对,需要两个设备都安装进行配对的apk(网上好多自动配对的帖子都没有说明情况)
2、在自动匹配的...
今天开始写博客来记录我的工作学习成长,作为一个初学者,近期的一个工作是通过Android蓝牙4.0来实现与蓝牙设备的数据交换,下面就通过代码和文字来解释一下整个过程。
        首先我要说明的...
转自:/blog/1179417
package cn.madfinger.  
  
import java.io.IOExc...
上次博客分享了Android蓝牙串口开发,本次博客主要在上一次开发的基础上增加了打开app如何自动连接上次连接的蓝牙设备 。
首先能够自动连接的前提条件是必须有一次蓝牙连接而且连接的配对信息...
智能设备BLE蓝牙
**敲重点:**
活动规则:来异步社区选取你想要读的图书,并在本博客评论区留言说一下你对本书的一些感想,
同时关注异步社区CSDN博客,并在博客评论区留言你想要得到的图书。
活动时间...
上一个博客写了如何进行Android蓝牙串口的实现,本次的博客主要讨论一下在打开app时自动连接上一次连接的蓝牙设备,蓝牙设备必须是以前已经配对过的设备。
本方法的思想很简单利用Shar...
Android N取消鼠标功能后重新打开
他的最新文章
讲师:汪剑
讲师:刘道宽
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
Android怎么实现蓝牙自动配对
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
Android Bluetooth 蓝牙设备之间自动配对
下载积分:400
内容提示:Android Bluetooth 蓝牙设备之间自动配对
文档格式:DOCX|
浏览次数:29|
上传日期: 10:54:32|
文档星级:
全文阅读已结束,如果下载本文需要使用
 400 积分
下载此文档
该用户还上传了这些文档
Android Bluetooth 蓝牙设备之间自动配对
关注微信公众号2013年10月 总版技术专家分月排行榜第三
2014年3月 Java大版内专家分月排行榜第一2014年1月 Java大版内专家分月排行榜第一2013年12月 Java大版内专家分月排行榜第一2013年11月 Java大版内专家分月排行榜第一2013年10月 Java大版内专家分月排行榜第一
本帖子已过去太久远了,不再提供回复功能。捷配欢迎您!
微信扫一扫关注我们
当前位置:&>>&&>>&&>>&基于蓝牙与Android设备的控制系统设计
&&& Android 操作系统是Google 基于开源的Linux 操作系统开发的移动操作平台,由操作系统、中间件、用户界面和应用软件组成,是专门为移动终端打造的开放和完整的移动操作系统。Android 软件平台包含Java Application、Application Framework、Libraries、Runtime 与LinuxOS 等层。用户可根据产品的不同需求对系统进行裁剪,从而适应多样的产品需求,Android 系统就如同积木一样通过组合不同的软硬件实现不同的应用产品。蓝牙的出现为移动设备的互联提供了一个方便快捷的选择,Android 设备和以为处理器的控制器联接使两者的功能得到了互补。
&&& 1 系统架构
&&& 基于蓝牙与Android 设备的控制系统由Android 设备和下位机组成。Android设备(Android 智能手机或Android 平板)安装有专门编制的软件。下位机采用 公司高效的RISC 内核的ATMEGA 8 为核心,并集成蓝牙串行模块为通信信道。Android 设备通过蓝牙将数据发送至下位机,下位机根据接收到数据,完成相应的控制功能,并将处理结果上传,实现实时监测、实时控制功能。下位机只负责数据的采集和实现控制功能,数据的存储和处理在Android 设备上实现。
&&& 2 下位机设计
&&& 2.1 控制模块的设计
&&& 下位机由ATMEAG8、数字温度、驱动电路等组成,其中CPU 部分电路如图1 所示。下位机处理器串口连接蓝牙模块。数字将当前温度直接转换成数字信号。蓝牙模块设置为从工作模式。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图1 CPU 电路原理图
&&& 系统上电后蓝牙模块处于等待连接状态, 当Android 设备第一次发出连接请求时需要输入蓝牙模块的内置密码,以后再连接时则不需要输入密码,只有密码匹配成功才能后成功建立蓝牙连接。蓝牙模块为Android 设备和ATMEAG8 的通信信道,实现Android 设备和下位机的双向数据连接。用户通过Android 设备向下位机发送命令,下位机接收到命令后,控制相应的执行模块,实现设定的控制功能。K1 和K2 为低电平,电机两端电压为0V,电机停止;K1 为高电平,K2为低电平电机两端为5V,电机正向转动;K1 为低电平,K2 为高电平电机两端为-5V,电机反向转动;K1 和K2 不能同时为高电平,电机驱动电路如图2 所示
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图2 电机驱动电路原理图
&&& 2.2 蓝牙模块
&&& 蓝牙模块型号为IDS-BM4A, 模块有主/ 从两种工作模式,通过PIO2 电平来选择模块的工作,PIO2 为高电平,模块工作在从模式。模块可以有两种应用方式,方式1 :从模块上电即开始工作,用户可以通过Android 设备查找模块,模块设备名称为”SPP”, 查到设备后选择连接,电脑端将提示输入密码,此时输入“0000”,电脑将与模块建立透明连接。方式2 :需要两个蓝牙模块,一个设置为主模式,一个设置为从模式,分别与两个MCU 连接,上电后主从模块会自动配对连接,连接成功后主从模块将建立透明数据传输,两个设备之间可以直接互发数据。
&&& 工作状态指示:模块PIO0 用来连接LED,指示当前工作方式。
&&& 主模式:未连接,LED 间隔1 秒钟快速闪烁2次;已连接,LED 常亮。
&&& 从模式:未连接,LED 快速闪烁;已连接,LED 常亮。
&&& 连接状态指示:模块PIO1 为连接状态指示,连接成功PIO1 为高电平,连接断开PIO1 为低电平。
&& 波特率设定表:
&&& 3 Android 设备软件设计
&&& Android2.2 版本以上才能很好的支持蓝牙功能,Android 上的应用程序一般采用Java 语言开发,编程环境一般采用Eclipse。
&&& Android 应用程序需要使用蓝牙功能, 必须在AndroidManifest.xml 中要申请两个权限:BLUETOOTH_ADMIN 和BLUETOOTH。具体格式如下:
&&& &uses-permissionandroid:na
&&& me="android.permission.BLUETOOTH"/&
&&& BLUETOOTH_ADMIN 权限允许Android 应用程序启动发现设备或者进行蓝牙功能的设置;BLUETOOTH 权限是Android 应用程序执行蓝牙通信必须具有的权限,例如接受连接和传送数据。大多数应用程序都需要这个权限,才能查找当地的蓝牙设备。
&&& 由于需要和下位机的蓝牙模块连接,在应用程序中需要实现主设备功能。具体的连接流程是:
&&& (1)在应用程序中检查设备的蓝牙功能是否开启,如果未开启,则打开蓝牙功能;
&&& (2)查找设备附近等待连接的蓝牙设备,显示查找到的蓝牙设备的物理地址(以前没有连接过的设备)或蓝牙设备的名称;
&&& (3)选择想要连接的蓝牙设备,如果是第一次连接这个目标设备系统会自动发起一个配对过程,弹出输入连接密码的对话框,输入“0000”,等待对方校验密码,完成配对,然后进行连接。
&&& (4)应用程序接收到连接成功,就可以通过生成的BluetoothServerSocke 和下位机进行数据传输。需要连接的蓝牙模块是蓝牙串口,因此应用程序中定义的UUID 必须符合蓝牙串口的UUID,这样连接才会被接受。因为accept() 调用是一个阻塞的调用,应用程序所有响应在调用返回之前会被阻塞,因此一定不能在主线程中进行调用, 通常是在一个新的线程中做所有的工作从而避免应用程序主线程的阻塞。主要代码如下;
&&& (5)关闭server ,释放serversocket 和它占用的资源,结束应用程序。
&&& 4 结束语
&&& 本文提出了基于蓝牙与Android 设备的无线控制系统模型,分析了蓝牙网络的一般结构, 采用通用的蓝牙模块实现了无线终端设计,给出了Android 设备的蓝牙串行通讯软件框架。凭借蓝牙的传输高效并且快速等特点,该系统具有很好的灵活性,能广泛应用于工业现场控制等多个领域,尤其是一些需要数据传输又不能很方便的布设通讯的场合,具有广阔的发展空间。
&&& 主要代码
技术资料出处:EDN China电子技术设计
该文章仅供学习参考使用,版权归作者所有。
因本网站内容较多,未能及时联系上的作者,请按本网站显示的方式与我们联系。
【】【】【】【】
上一篇:下一篇:
本文已有(0)篇评论
发表技术资料评论,请使用文明用语
字符数不能超过255
暂且没有评论!
暂且没有信息...
12345678910
当我们拿到一块MCS-51系列单片机芯片时,看到这么多的引脚,他们都有干什么用的?80的引脚图:MCS-51是标准的40引脚双列直插式集成电路芯片,引脚分布请参照----单片机引脚图:l P0.0~P0.7 P0口8位双向口线(在引脚的39~32号端子)。l P1.0~P1....[][][][][][][][][][]
IC热门型号
IC现货型号
推荐电子百科}

我要回帖

更多关于 android 断开蓝牙连接 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信