蓝牙设置种常用的Intent
下面是在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相关推荐
- Android 点击跳转到蓝牙设置界面
点击跳转到蓝牙设置界面 1.布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout ...
- 台式计算机蓝牙无服务,Windows10无法找到蓝牙设置三种解决方法
说到蓝牙,大家首先想到就是手机上的,现在蓝牙用于将各种设备连接到您的计算机. 它可能是你的键盘,鼠标,手机,耳机等等.一些用户反馈说在Windows10系统中无法找到蓝牙设置,怎么办呢?针对此疑问,接 ...
- 【群晖】两种常用下载器设置及使用
[群晖]两种常用下载器设置及使用群晖上的下载器比较多,有官方的 Download Station,也有第三方的 Transmission 和 qbittorrent这里只讲解 Download Sta ...
- Android车载应用开发与分析(13)- 系统设置-蓝牙设置
1. 前言 Android 车载应用开发与分析是一个系列性的文章,这个是第13篇分析系统设置,该系列文章旨在分析原生车载Android系统中核心应用的实现方式,帮助初次从事车载应用开发的同学,更好地理 ...
- android 实现蓝牙自动配对连接,Android实践 -- Android蓝牙设置连接
蓝牙开发相关 使用Android Bluetooth APIs将设备通过蓝牙连接并通信,设置蓝牙,查找蓝牙设备,配对蓝牙设备 连接并传输数据,以下是Android系统提供的蓝牙相关的类和接口 Blue ...
- 超低功耗蓝牙模块的常用工作模式
转贴 超低功耗蓝牙模块的常用工作模式 http://www.openedv.com/thread-86300-1-1.html (出处: OpenEdv-开源电子网) 超低功耗蓝牙4.0模块,用于点对 ...
- C#的6种常用集合类大比拼【月儿原创】
C#的6种常用集合类大比拼 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/ 时间:2007.6.27 说明:MSDN没有说出几种集合类其间的区别 ...
- 基于 Python 的 8 种常用抽样方法
抽样是统计学.机器学习中非常重要,也是经常用到的方法,因为大多时候使用全量数据是不现实的,或者根本无法取到.所以我们需要抽样,比如在推断性统计中,我们会经常通过采样的样本数据来推断估计总体的样本. 上 ...
- 详细介绍!Linux 上几种常用的文件传输方式
点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 责编:乐乐 来源:https://dwz.cn/VWIHhsOw 昨天发布一篇Linux文章( ...
最新文章
- windows下buildbot 的搭建及config文件讲解
- 如何在README中使用图片
- 浅论 C++ 的复杂性
- python中排序从小到大_Python实现对特定列表进行从小到大排序操作示例
- 如何在你的blog中添加炫酷的飘雪动画效果
- 关于计算机航天生物的想像作文,未来的航天员想象作文
- symbolicatecrash App Bug 分析工具
- 怎样稳稳获得年化高收益
- Error:field larger than field limit(131072)解决方法
- 测试测量 | 【四】如何实现生产过程中的自动化测试?——保证高频信号的准确传输
- java 获取一年内周六周日日期
- 前端剑法第四式————御风
- 【智能优化算法】鸡群算法 (Chicken Swarm Optimization, CSO),2014
- Java PDF数字签名(一) - 添加数字签名
- Windows Hook 易核心编程勾子基本理念
- PMS-adb install安装应用流程(Android L)
- [改善脑力的23条方法]
- 迅搜安装流程(基于官方文档)
- JS中的new操作符原理解析
- 佳能Canon PIXMA iP2880 打印机驱动