下面是在bluetoothsettings.java 中注册蓝牙Intent的函数:

private boolean initBluetoothAPI() {

mIntentFilter =

//  跟远端蓝牙设备连接上时返回来的intent

new IntentFilter(BluetoothIntent.REMOTE_DEVICE_CONNECTED_ACTION);

//  跟远端蓝牙设备断开时返回来的intent mIntentFilter.addAction(BluetoothIntent.REMOTE_DEVICE_DISCONNECTED_ACTION);

//  跟远端的蓝牙设备配对上时收到的intent,不过前提是对方主动发起的配对

//  才能收到这个intent

mIntentFilter.addAction(BluetoothIntent.BONDING_CREATED_ACTION);

//  本地蓝牙设备可用时收到的Intent

mIntentFilter.addAction(BluetoothIntent.ENABLED_ACTION);

//  本地蓝牙设备不可用时收到的Intent

mIntentFilter.addAction(BluetoothIntent.DISABLED_ACTION);

//  扫描到远端设备时收到的intent   mIntentFilter.addAction(BluetoothIntent.REMOTE_DEVICE_FOUND_ACTION);

//   远端蓝牙设备消失时收到的intent        mIntentFilter.addAction(BluetoothIntent.REMOTE_DEVICE_DISAPPEARED_ACTION);

//   远端蓝牙设备名称更换时收到的intent,因为刚发现设备的时候还没有获取//    它的名称

mIntentFilter.addAction(BluetoothIntent.REMOTE_NAME_UPDATED_ACTION);

//  当有远端设备发起配对请求时收到的intent

mIntentFilter.addAction(BluetoothIntent.PAIRING_REQUEST_ACTION);

//  蓝牙耳机状态改变时候到的intent

mIntentFilter.addAction(BluetoothIntent.HEADSET_STATE_CHANGED_ACTION);

// 扫描设备结束

mIntentFilter.addAction(BluetoothIntent.DISCOVERY_COMPLETED_ACTION);

//  扫描开始

mIntentFilter.addAction(BluetoothIntent.DISCOVERY_STARTED_ACTION);

//  蓝牙设备模式改变,表示本地蓝牙设备是否可以被查找

mIntentFilter.addAction(BluetoothIntent.MODE_CHANGED_ACTION);

//   有耳机插入

mIntentFilter.addAction(Intent.ACTION_HEADSET_PLUG);

启动蓝牙

在启动蓝牙的时候,要注意的地方是不能正常启动蓝牙的情况,因为正常启动的时候会返回BluetoothIntent.ENABLED_ACTION 这个Intent,当时当启动出现异常的时候是没有Intent返回的,android使用回调函数来解决这个问题。下面是在bluetoothdeviceservice.java 里面enable((IBluetoothDeviceCallback callback) 的过程:

public synchronized boolean enable(IBluetoothDeviceCallback callback) {

checkPermissionBluetoothAdmin();

Log.d(TAG,"start enable! ");

// Airplane mode can prevent Bluetooth radio from being turned on.

if (mIsAirplaneSensitive && isAirplaneModeOn()) {

return false;

}

if (mIsEnabled) {

return false;

}

if (mEnableThread != null && mEnableThread.isAlive()) {

return false;

}

//   主要的启动过程是放在一个新起的线程里面,但是不管能不能启动

//    仍然返回了true

mEnableThread = new EnableThread(callback);

mEnableThread.start();

//

return true;

}

private EnableThread mEnableThread;

private class EnableThread extends Thread {

private final IBluetoothDeviceCallback mEnableCallback;

public EnableThread(IBluetoothDeviceCallback callback) {

mEnableCallback = callback;

}

public void run() {

boolean res = enableNative();

if (res) {

mEventLoop.start();

}

if (mEnableCallback != null) {

try {

// 通过回调函数来表明是否正常启动蓝牙设备

mEnableCallback.onEnableResult(res ?

BluetoothDevice.RESULT_SUCCESS :

BluetoothDevice.RESULT_FAILURE);

} catch (RemoteException e) {}

}

if (res) {

mIsEnabled = true;

mIsDiscovering = false;

Intent intent = new Intent(BluetoothIntent.ENABLED_ACTION);

mContext.sendBroadcast(intent);

}

}else{

mIsEnabled = false;

mIsDiscovering = false;

}

mEnableThread = null;

}

}

//  这个回调函数将被作为参数传进bluetoothservice 里面的enable(IBluetoothDeviceCallback callback)

static class DeviceCallback extends IBluetoothDeviceCallback.Stub {

Handler messageHandler;

public void setHandler(Handler handler) {

synchronized (this) {

messageHandler = handler;

}

public void onEnableResult(int result) {

switch(result) {

//  启动不成功的时候执行

case BluetoothDevice.RESULT_FAILURE:

messageHandler.sendMessage(messageHandler.obtainMessage(EVENT_FAILED_BT_ENABLE,0));

break;

}

}

//   配对完成时执行

public void onCreateBondingResult(String address, int result) {

synchronized (this) {

if (messageHandler != null) {

if (result == BluetoothDevice.RESULT_FAILURE) {

messageHandler.sendMessage(messageHandler.obtainMessage(

HANDLE_PAIRING_FAILED, address));

} else {

messageHandler.sendMessage(messageHandler.obtainMessage(

HANDLE_PAIRING_PASSED, address));

}

}

}

}

};

关闭过程

public synchronized boolean disable() {

checkPermissionBluetoothAdmin();

if (mEnableThread != null && mEnableThread.isAlive()) {

return false;

}

if (!mIsEnabled) {

return true;

}

if(!disableNative()){

Log.d(TAG,"disableNative false ");

return false;

}

mEventLoop.stop();

mIsEnabled = false;

mIsDiscovering = false;

Intent intent = new Intent(BluetoothIntent.DISABLED_ACTION);

mContext.sendBroadcast(intent);

return true;

}

配对过程

private void doPair(Preference pref, String address) {

pref.setEnabled(false);

pref.setSummary(STR_PAIRING);

if (mPinEdit != null){

String strPIN = mPinEdit.getText().toString();

mBluetooth.writePinCode(address, strPIN);

mBluetooth.createBonding(address, sDeviceCallback);

}

}

最后根据配对的结果执行回调函数的onCreateBondingResult。

转载于:https://www.cnblogs.com/tnxk/archive/2012/03/19/2405771.html

蓝牙设置种常用的Intent相关推荐

  1. Android 点击跳转到蓝牙设置界面

    点击跳转到蓝牙设置界面 1.布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout ...

  2. 台式计算机蓝牙无服务,Windows10无法找到蓝牙设置三种解决方法

    说到蓝牙,大家首先想到就是手机上的,现在蓝牙用于将各种设备连接到您的计算机. 它可能是你的键盘,鼠标,手机,耳机等等.一些用户反馈说在Windows10系统中无法找到蓝牙设置,怎么办呢?针对此疑问,接 ...

  3. 【群晖】两种常用下载器设置及使用

    [群晖]两种常用下载器设置及使用群晖上的下载器比较多,有官方的 Download Station,也有第三方的 Transmission 和 qbittorrent这里只讲解 Download Sta ...

  4. Android车载应用开发与分析(13)- 系统设置-蓝牙设置

    1. 前言 Android 车载应用开发与分析是一个系列性的文章,这个是第13篇分析系统设置,该系列文章旨在分析原生车载Android系统中核心应用的实现方式,帮助初次从事车载应用开发的同学,更好地理 ...

  5. android 实现蓝牙自动配对连接,Android实践 -- Android蓝牙设置连接

    蓝牙开发相关 使用Android Bluetooth APIs将设备通过蓝牙连接并通信,设置蓝牙,查找蓝牙设备,配对蓝牙设备 连接并传输数据,以下是Android系统提供的蓝牙相关的类和接口 Blue ...

  6. 超低功耗蓝牙模块的常用工作模式

    转贴 超低功耗蓝牙模块的常用工作模式 http://www.openedv.com/thread-86300-1-1.html (出处: OpenEdv-开源电子网) 超低功耗蓝牙4.0模块,用于点对 ...

  7. C#的6种常用集合类大比拼【月儿原创】

    C#的6种常用集合类大比拼 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/           时间:2007.6.27 说明:MSDN没有说出几种集合类其间的区别 ...

  8. 基于 Python 的 8 种常用抽样方法

    抽样是统计学.机器学习中非常重要,也是经常用到的方法,因为大多时候使用全量数据是不现实的,或者根本无法取到.所以我们需要抽样,比如在推断性统计中,我们会经常通过采样的样本数据来推断估计总体的样本. 上 ...

  9. 详细介绍!Linux 上几种常用的文件传输方式

    点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 责编:乐乐 来源:https://dwz.cn/VWIHhsOw 昨天发布一篇Linux文章( ...

最新文章

  1. windows下buildbot 的搭建及config文件讲解
  2. 如何在README中使用图片
  3. 浅论 C++ 的复杂性
  4. python中排序从小到大_Python实现对特定列表进行从小到大排序操作示例
  5. 如何在你的blog中添加炫酷的飘雪动画效果
  6. 关于计算机航天生物的想像作文,未来的航天员想象作文
  7. symbolicatecrash App Bug 分析工具
  8. 怎样稳稳获得年化高收益
  9. Error:field larger than field limit(131072)解决方法
  10. 测试测量 | 【四】如何实现生产过程中的自动化测试?——保证高频信号的准确传输
  11. java 获取一年内周六周日日期
  12. 前端剑法第四式————御风
  13. 【智能优化算法】鸡群算法 (Chicken Swarm Optimization, CSO),2014
  14. Java PDF数字签名(一) - 添加数字签名
  15. Windows Hook 易核心编程勾子基本理念
  16. PMS-adb install安装应用流程(Android L)
  17. [改善脑力的23条方法]
  18. 迅搜安装流程(基于官方文档)
  19. JS中的new操作符原理解析
  20. 佳能Canon PIXMA iP2880 打印机驱动

热门文章

  1. Ubuntu下安装vim以及常用命令
  2. 题解 AT934 【完全数】
  3. 本地项目文件夹同步到GitLab的操作步骤
  4. JavaScript:Functions
  5. smtp 邮件发送 附带ssl版本
  6. SQL Server 2000 ——系统表和系统视图
  7. mysql卡住锁表 processlist explain
  8. shell脚本实例-命令记录
  9. js实现treeview 级联修改状态
  10. SQL Server 2005 14420 14421错误