BluetoothService类中定义的Native方法都在android_server_BluetoothServer.cpp里创建jni调用java
1、开启(BT Turn on Turn off) (蓝牙的打开关闭由类BluetoothEnabler控制。)
1.由BluetoothEnabler控制界面操做,在其构造函数里会先调用 LocalBluetoothManager.getInstance(context)。android
2.而后在LocalBluetoothManager类的getInstance函数里会调用当前类下的init()函数,该init()函数中经过BluetoothAdapter.getDefaultAdapter()得到蓝牙设备的句柄,若是当前没有蓝牙设备则返回null。 异步
3.初始化完毕会监听checkbox的状态,当触发点击checkbox会响应onPreferenceChange方法,其中将调用 LocalBluetoothManager.setBluetoothEnabled(enable)方法。函数
而LocalBluetoothManager.setBluetoothEnabled(enable)方法,会调用mAdapter.enable()方法,enable()方法又会调用 BluetoothService.enable()方法。其中,oop
(1)打开(关闭)操做成功后会有一个异步事件ACTION_STATE_CHANGED返回,异步事件由类BluetoothEventRedirector控制(接收广播,进行处理)。在收到ACTION_STATE_CHANGED异步事件后,还须要作update本地设备profile的事情,读取上次关闭前搜索到的蓝牙设备。this
(1.1)update本地设备profile的事情:?spa
(1.2)读取上次关闭前搜索到的蓝牙设备:线程
经过LocalBluetoothManager.setBluetoothStateInt(int state)方法调到 CachedBluetoothDeviceManager.onBluetoothStateChanged方法来读取上次关闭以前搜索到device. code
(2)来开启EnableThread线程,进行打开操做,蓝牙的打开关闭属于异步操做。server
ps:在启动蓝牙的时候,要注意的地方是不能正常启动蓝牙的状况,由于正常启动的时候会返回BluetoothIntent.ENABLED_ACTION 这个Intent,当时当启动出现异常的时候是没有Intent返回的,android使用回调函数来解决这个问题。下面是在bluetoothdeviceservice.java 里面enable((IBluetoothDeviceCallback callback) 的过程:(如下代码属于较低版本的android源码,与较高版本源码中已有所不一样,只做为参考...)
View Code 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)); } } } } }
涉及到的类:
BluetoothService(最主要的类,开启具体命令的线程进行enable,disable等操做)
LocalBluetoothManager(本机蓝牙设备管理,开启关闭,搜索等等,初始化BluetoothAdapter)
BluetoothEnabler(界面的点击和状态文字的显示)
BluetoothAdapter(framework封装的类,提供本地蓝牙设备的配置,包括开启蓝牙,搜索周围蓝牙设备,设置本地蓝牙可见性;创建LocalBluetoothManager和BluetoothService的映射关系,主要是经过它调用BluetoothService的函数)
BluetoothEventRedirector(接收Bluetooth API 的广播和回调,而且将Settings中的UI线程上的事件分派到正确的类)
2、可检测性(Discoverable)
1.蓝牙的discoverable mode由类BluetoothDiscoverableEnabler控制。点击将触发OnPreferenceChangeListener监听事件,调用onPreferenceChange()方法,该方法中调用setEnabled(true),而setEnabled(true)方法将调用到BluetoothAdapter的setScanMode () 方法。
蓝牙模式有两种模式SCAN_MODE_CONNECTABLE_DISCOVERABLE(可链接可发现)和SCAN_MODE_CONNECTABLE(可链接但不可发现)
3、扫描
1.在BluetoothSetting里触发点击,调用LocalBluetoothManager.startScanning(true)函数,经过BluetoothAdapter的startDiscovery调用到BluetoothService里的startDiscovery来调用Native函数 startDiscoveryNative()。
startDiscovery()是个异步函数,会当即返回,经过注册 ACTION_DISCOVERY_STARTED、ACTION_DISCOVERY_FINISHED、ACTION_FOUND,来肯定当前的状态。
当蓝牙由disable变成enable时会调用扫描,当距离上次扫描超过5分钟的前提下,退出页面,再进到页面的时候也会启动扫描。
在启动scan的时候,还会判断当前是否在播放音乐,若是在播放音乐,则不启动扫描。
点击查找设备后,会把设备列表里没有配对的设备清除掉,保留配对状态的设备。
扫描的过程是一个很耗费资源的过程,在扫描过程,不会去尝试进行新的链接,扫描时间默认是12秒,它是以一个系统服务的形式存在的,能够调用cancelDiscovery()来取消扫描。
4、链接
1.1 在setting界面点击链接,会调到CachedBluetoothDevice类的connect方法。
1.2 而connect方法会调用connectWithoutResettingTimer()方法。
1.3 而connectWithoutResettingTimer()方法会调用 connectInt方法。
在connectInt里,根据不一样的profile来得到profilemanger,而后调用 profilemanger.connect()函数 。此处的连接会涉及到的profile有A2DP AVRCP DUN HSP HFP 等。
同理若是配对或者解除配对,也会调到CachedBluetoothDevice类的pair()方法和unpair()。
以A2DP为例,在connectInt里,根据不一样的profile来得到profilemanger,而后调用 profilemanger.connect()函数,在这个函数里调用了BluetoothA2dpService的connectSink()函数,最后调到Native方法
connectSinkNative()去创建链接。
涉及到的一些类:
CachedBluetoothDevice(搜索到的设备)
BluetoothDevice(设备类)
LocalBluetoothProfileManager(是一个抽象类,各类ProfileManger,实例化各类Profile的service)
SettingsBtStatus(蓝牙的状态类)
BluetoothA2dp(为LocalBluetoothProfileManager和BluetoothA2dpService创建映射关系)
BluetoothA2dpService(最终的服务类,由它调用链接、断开等Native函数,和底层通讯)
其余文件做用(接收与发送相似)
1.BluetoothOppReceiver.java 这个类里描述的是蓝牙传输文件过程当中接收到的广播事件。
2.BluetoothOppTransfer.java 管理文件传输的类
3. BluetoothOppService.java 蓝牙传输文件后台的类
4. BluetoothOppObexClientSession.java 具体实现文件传输的类
1
、开启
步骤
1
:首先从BTSettings开始,执行onCreate方法。由于是初始化状态,因此
if
(action.equal(BTDevicePicker.ACTION_LAUNCH))不知足,故执行
else
语句。
步骤
2
:初始化mEnable对象,调用BTEnable构造函数。经过LocalBTManager.getInstance调用init方法,再经过init方法调用BTAdapter.getDefaultAdapter()得到适配器句柄。
步骤
3
:各类初始化完毕后,执行BTSettings中的onResume方法,调用BTEnabler.resume方法,该resume方法为组合框设置监听事件。
步骤
4
:当蓝牙开启时,该组合框被选中,将响应监听事件,执行BTEnabler.onPreferenceChange方法。该方法中会调用LocalBTManager.setBTEnabled方法。而setBTEnabled方法会调用BTAdapter.enable()方法,继而调用BTService.enable()方法,继而调用BTService.enable(
true
)方法。在该方法中,
(
1
)当enable(
true
)方法返回
true
时,在setBTEnabled方法中会调用BTService中的setBTStateInt方法,继而广播出去,由BTEventRedirector类接收。
(
2
)开启新的线程,主要的启动过程是放在这个新启动的线程里面。
(
3
)开启蓝牙后,会调用CachedBTDeviceManager.onBTStateChanged方法来读取上次关闭前搜索到的蓝牙设备。
2
.可检测的
点击“可检测性”组合框,将触发BTDiscoverableEnabler.onPreferenceChange方法,而后调用同个类中的setEnabled方法,来调用BTAdapter.setScanMode方法(其中传递SCAN_MODE_CONNECTABLE_DISCOVERABLE参数),继而会调用BTService.setScanMode方法,在该方法中,会经过setDiscoverableTimeout方法设置检测时间。
3
.扫描
BTSettings的onResume方法继续往下运行,将调用LocalBTManager.startScanning方法,该方法会调用BTAdapter.startDiscovery方法,继而调用BTService.startDiscovery方法,再调用startDIscoveryNative方法。
4
.链接
步骤
1
:在setting界面点击链接,会调到CachedBluetoothDevice类的connect方法。
步骤
2
:而connect方法会调用connectWithoutResettingTimer()方法。
步骤
3
:而connectWithoutResettingTimer()方法会调用 connectInt方法。
步骤
4
:在connectInt里,根据不一样的profile来得到profilemanger,而后调用 profilemanger.connect()函数 。此处的连接会涉及到的profile有A2DP AVRCP DUN HSP HFP 等。
同理若是配对或者解除配对,也会调到CachedBluetoothDevice类的pair()方法和unpair()。
|