蓝牙开发相关

使用Android Bluetooth APIs将设备通过蓝牙连接并通信,设置蓝牙,查找蓝牙设备,配对蓝牙设备

连接并传输数据,以下是Android系统提供的蓝牙相关的类和接口

BluetoothAdapter

BluetoothDevice

BluetoothSocket

BluetoothServerSocket

BluetoothClass

BluetoothProfile

BluetoothHeadset

BluetoothA2dp

BluetoothHealth

BluetoothHealthCallback

BluetoothHealthAppConfiguration

BluetoothProfile.ServiceListener

蓝牙权限

使用蓝牙功能,需要在AndroidManifest.xml中声明蓝牙相关的权限

建立蓝牙

初始化连接

在通过蓝牙通信之前,需要先确定设备是否支持蓝牙功能,先初始化一个BluetoothAdapter的实例,

BluetoothAdapter提供了一个静态方法getDefaultAdapter()来获得BluetoothAdapter的实例

BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

if (mBluetoothAdapter == null) {

// 设备不支持蓝牙功能

}

打开蓝牙

下一步就是打开蓝牙,调用isEnabled()方法检查蓝牙功能是否已经打开,返回true说明蓝牙已开启,

返回false说明蓝牙功能未开启,开启蓝牙可以通过发送广播ACTION_REQUEST_ENABLE,也可以通过方法

enable()直接打开,这两种方法都会有蓝牙权限的提示,选择允许,否则无法打开蓝牙

if (!mBluetoothAdapter.isEnabled()) {

Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);

}

mBluetoothAdapter.enable();

在应用中可以设置蓝牙的状态的监听ACTION_STATE_CHANGED广播,当蓝牙的状态的变化时,就会触发这个

广播,接收到这个广播之后,在intent中可以获得当前蓝牙的状态和前一次的蓝牙的状态

int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR);

蓝牙的状态值有:

int STATE_OFF = 10;//蓝牙关闭状态

int STATE_TURNING_ON = 11;//蓝牙正在打开

int STATE_ON = 12;//蓝牙打开状态

int STATE_TURNING_OFF = 13;//蓝牙正在关闭

查找蓝牙设备

打开蓝牙之后,下一步就是查找可以使用的蓝牙设备,蓝牙的api中也提供了相关的接口,由于蓝牙的扫描

是一个耗电的操作,不用时计时取消扫描蓝牙

mBluetoothAdapter.isDiscovering(); //监测蓝牙是否正在扫描

mBluetoothAdapter.startDiscovery();//开始扫描

mBluetoothAdapter.cancelDiscovery();//取消扫描

为了发现可用的蓝牙的设备,必须在应用中注册ACTION_FOUND的广播,调用方法startDiscovery()如果查找到可用的

设备会触发这个广播,这个广播中带有EXTRA_DEVICE的设备信息可以通过下面的方法获得设备的信息

private final BroadcastReceiver mReceiver = new BroadcastReceiver() {

public void onReceive(Context context, Intent intent) {

String action = intent.getAction();

if (BluetoothDevice.ACTION_FOUND.equals(action)) {

BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

Log.e("tag","device name: "+device.getName()+" address: "+device.getAddress());

}

}

};

IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);

registerReceiver(mReceiver, filter);

查询已经配对的设备列表

在进行查找之前,可以先获得之前已经配对成功的蓝牙设备的列表,可以调用方法getBondedDevices()获得

已经配对的蓝牙设备列表

Set pairedDevices = mBluetoothAdapter.getBondedDevices();

if (pairedDevices.size() > 0) {

for (BluetoothDevice device : pairedDevices) {

//可以获得已经配对的蓝牙的名称和地址

Log.e("tag","device name: "+device.getName()+" address: "+device.getAddress());

}

}

是其他设备可见

上面讲的都是发现其他的蓝牙设备,也可以设置设备本身是否对其他设备可见,通过发送ACTION_REQUEST_DISCOVERABLE

的广播,会调用系统的方法,还可以设置多长时间内是可见的,在intent中设置EXTRA_DISCOVERABLE_DURATION,最大值是

3600s,超过3600s会设置为120s,点击允许会回调onActivityResult()方法

//设置设备在300s内是可见的

Intent discoverableIntent = new

Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);

discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);

startActivity(discoverableIntent);

如果没有打开蓝牙,执行上面的操作会自动打开蓝牙

可以通过监听ACTION_SCAN_MODE_CHANGED广播,可以在intent中根据EXTRA_SCAN_MODE的参数获得当前设备的SCAN MODE

有一些几种模式

int SCAN_MODE_NONE = 20;//这个模式不能被发现也不能连接

int SCAN_MODE_CONNECTABLE = 21;//这个模式不能被扫描到,但是可以连接

int SCAN_MODE_CONNECTABLE_DISCOVERABLE = 23;//这个模式可以被发现,也能被连接

蓝牙的连接

Server 端

通过BluetoothAdapter的listenUsingRfcommWithServiceRecord(String, UUID)方法获得BluetoothServerSocket对象

的实例,然后socket就会通过accept()监听客户端的连接的状态

private class AcceptThread extends Thread {

private final BluetoothServerSocket mmServerSocket;

public AcceptThread() {

BluetoothServerSocket tmp = null;

try {

tmp = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);

} catch (IOException e) { }

mmServerSocket = tmp;

}

public void run() {

BluetoothSocket socket = null;

// 在后台一直监听客户端的请求

while (true) {

try {

socket = mmServerSocket.accept();

} catch (IOException e) {

break;

}

if (socket != null) {

mmServerSocket.close();

break;

}

}

}

public void cancel() {

try {

mmServerSocket.close();

} catch (IOException e) { }

}

}

Client 端

使用BluetoothDevice的createRfcommSocketToServiceRecord(UUID)方法获得BluetoothSocket对象的实例

然后调用connect()方法,这时server端会监听到这个请求,之后就建立连接,然后就可以进行通信了

private class ConnectThread extends Thread {

private final BluetoothSocket mmSocket;

private final BluetoothDevice mmDevice;

public ConnectThread(BluetoothDevice device) {

BluetoothSocket tmp = null;

mmDevice = device;

try {

tmp = device.createRfcommSocketToServiceRecord(MY_UUID);

} catch (IOException e) { }

mmSocket = tmp;

}

public void run() {

mBluetoothAdapter.cancelDiscovery();

try {

mmSocket.connect();

} catch (IOException connectException) {

try {

mmSocket.close();

} catch (IOException closeException) { }

return;

}

}

public void cancel() {

try {

mmSocket.close();

} catch (IOException e) { }

}

}

连接的监听

可以通过注册广播监听蓝牙设备连接的状态变化,广播BluetoothDevice.ACTION_BOND_STATE_CHANGED,监听到这个广播之后,可以

在intent中获得连接的状态

int state = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.BOND_NONE);

设备连接的状态值

int BOND_NONE = 10;//没有连接

int BOND_BONDING = 11;//正在连接

int BOND_BONDED = 12;//已经建立连接

android 实现蓝牙自动配对连接,Android实践 -- Android蓝牙设置连接相关推荐

  1. android 实现ble蓝牙自动配对连接

    蓝牙自动配对,即搜索到其它蓝牙设备之后直接进行配对,不需要弹出配对确认框或者密钥输入框. 本文章用来连接蓝牙设备ai-thinker,如果你要连接其他蓝牙设备,注意修改相关名字以及修改设备初试pin值 ...

  2. android蓝牙配对 自动联接,Android系统下蓝牙自动配对连接方法

    Android系统下蓝牙自动配对连接方法 [专利摘要]本发明涉及一种Android系统下蓝牙自动配对连接方法,其包括如下步骤:步骤1.在Android设备端内存储上次进行蓝牙连接蓝牙外设的蓝牙地址,并 ...

  3. 【转载】Android蓝牙自动配对Demo

    注:新版本安卓需增加权限 <uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION ...

  4. 蓝牙自动配对警惕PIN码漏洞攻击

    蓝牙自动配对警惕PIN码漏洞攻击 配对是蓝牙设备间身份认证的一个过程,只有成功配对的两个设备才能连接并进行数据交互,所以配对是蓝牙操作中必不可少的流程. 在<蓝牙配对协议分析一>和< ...

  5. Android下的蓝牙自动配对

    转载        源码下载地址 经过最近一段时间得研究,针对网上给出的案例.总结了一个亲测好使的Demo. 说明如下: 1.本Demo用来连接蓝牙设备HC-05,如果你要连接其他蓝牙设备,注意修改相 ...

  6. video.js android,VideoJS + HTML5自动播放失败,适用于Android 2.3+和IOS 4+

    我的VideoJS和HTML5项目针对更新的Web浏览器(较新版本的FireFox和Chrome)以及移动浏览器(Android2.3 +和IOS4 +).VideoJS + HTML5自动播放失败, ...

  7. android源码灭屏时蓝牙自动配对

    1.android4.4/packages/apps/Settings/src/com/android/settings/bluetooth/BluetoothPairingDialog.java 添 ...

  8. android 恢复出厂 自动恢复文件夹,基于Android系统快速恢复出厂设置方法的实现...

    龚强 摘 要:针对使用Android系统的智能电视进行恢复出厂设置时重置速度慢的情况进行了研究和分析,从其重置原理入手,通过简化备份.导入.执行等设置方法以实现该系统的快速恢复出厂设置.实践证明,该方 ...

  9. 【Android】蓝牙开发——经典蓝牙:配对与解除配对 实现配对或连接时不弹出配对框

    目录 一.配对方法 二.解除配对方法 三.配对/解除配对结果 四.justwork配对模式下,不弹出配对框 五.pincode配对模式下,不弹出配对框 六.小结 在之前的文章[Android]蓝牙开发 ...

最新文章

  1. C++11多线程中std::call_once的使用
  2. uiswitchbutton 点击不改变状态_Redux 包教包会(一):解救 React 状态危机
  3. 最高65万美元!2021美大厂码农收入一览
  4. 学习js,尝试写一个表单验证框架(1)-规划
  5. 使用jquery ajax代替iframe
  6. Python中的__new__()方法的使用
  7. birt脚本for循环语句_如何使用 for 循环语句嵌套方法!
  8. 利用sort对数组快速排序
  9. 使用spring集成的kafka收发消息
  10. arguments.callee弃用与webuploader
  11. 深度学习入门笔记(四):神经网络
  12. 【数据结构上机练习】考试题目 3
  13. php libiconv close_PHP 5.3.10 编译安装时出现 undefined reference to `libiconv' 错误的解决方法...
  14. ERROR ITMS-90096
  15. 小猪的猪栏文章类目导航
  16. UVa Problem 123 - Searching Quickly
  17. 机器学习小组知识点17:对数正态分布(Logarithmic Normal Distribution)
  18. 你终将成为你潜意识中想要成为的人
  19. android开发自定义键盘,Android 总结:自定义键盘实现原理和三种实例详解
  20. 跨越逐梦路上的荆棘(程序猿生存指南)

热门文章

  1. 程序员面试金典——7.7第k个数(丑数)
  2. 台大李宏毅Machine Learning 2017Fall学习笔记 (16)Unsupervised Learning:Neighbor Embedding
  3. Undefined control sequence.l.463 \cita
  4. python 视频转换为图像,图像转换为视频
  5. 【pytest】命令行选项
  6. Unity的学习笔记(XLua的初学用法并在lua中使用unity周期函数)
  7. 白话之jsonp跨域原理分析
  8. PHP导出MySQL数据字典 Summer-Mysql-Dic
  9. 学渣的心酸(求职篇)
  10. [大牛翻译系列]Hadoop(4)MapReduce 连接:选择最佳连接策略