《android 蓝牙源码分析.doc》由会员分享,可在线阅读,更多相关《android 蓝牙源码分析.doc(9页珍藏版)》请在金锄头文库上搜索。
1、android 蓝牙源码分析BluetoothService类中定义的Native方法都在android_server_BluetoothServer.cpp里建立jni调用一、开启(BT Turn on Turn off) (蓝牙的打开关闭由类BluetoothEnabler控制。)1.由BluetoothEnabler控制界面操作,在其构造函数里会先调用 LocalBluetoothManager.getInstance(context)。2.然后在LocalBluetoothManager类的getInstance函数里会调用当前类下的init()函数,该init()函数中通过Bluet
2、oothAdapter.getDefaultAdapter()获得蓝牙设备的句柄,如果当前没有蓝牙设备则返回null。 3.初始化完毕会监听checkbox的状态,当触发点击checkbox会响应onPreferenceChange方法,其中将调用 LocalBluetoothManager.setBluetoothEnabled(enable)方法。而LocalBluetoothManager.setBluetoothEnabled(enable)方法,会调用mAdapter.enable()方法,enable()方法又会调用 BluetoothService.enable()方法。其中,(
3、1)打开(关闭)操作成功后会有一个异步事件ACTION_STATE_CHANGED返回,异步事件由类BluetoothEventRedirector控制(接收广播,进行处理)。在收到ACTION_STATE_CHANGED异步事件后,还需要做update本地设备profile的事情,读取上次关闭前搜索到的蓝牙设备。(1.1)update本地设备profile的事情:?(1.2)读取上次关闭前搜索到的蓝牙设备:通过LocalBluetoothManager.setBluetoothStateInt(int state)方法调到 CachedBluetoothDeviceManager.onBlu
4、etoothStateChanged方法来读取上次关闭之前搜索到device. (2)来开启EnableThread线程,进行打开操作,蓝牙的打开关闭属于异步操作。ps:在启动蓝牙的时候,要注意的地方是不能正常启动蓝牙的情况,因为正常启动的时候会返回BluetoothIntent.ENABLED_ACTION 这个Intent,当时当启动出现异常的时候是没有Intent返回的,android使用回调函数来解决这个问题。下面是在bluetoothdeviceservice.java 里面enable((IBluetoothDeviceCallback callback) 的过程:(以下代码属于较
5、低版本的android源码,与较高版本源码中已有所不同,只作为参考.) 001 View Code 002 public synchronized boolean enable(IBluetoothDeviceCallback callback) 003 checkPermissionBluetoothAdmin(); 004 Log.d(TAG,start enable! ); 005 / Airplane mode can prevent Bluetooth radio from being turned on. 006 if (mIsAirplaneSensitive & isAirpl
6、aneModeOn() 007 return false; 008 009 if (mIsEnabled) 010 return false; 011 012 if (mEnableThread != null & mEnableThread.isAlive() 013 return false; 014 015 / 主要的启动过程是放在一个新起的线程里面,但是不管能不能启动 016 / 仍然返回了true 017 mEnableThread = new EnableThread(callback); 018 mEnableThread.start(); 019 / 020 return tr
7、ue; 021 022 023 024 private EnableThread mEnableThread; 025 private class EnableThread extends Thread 026 private final IBluetoothDeviceCallback mEnableCallback; 027 public EnableThread(IBluetoothDeviceCallback callback) 028 mEnableCallback = callback; 029 030 public void run() 031 boolean res = ena
8、bleNative(); 032 if (res) 033 mEventLoop.start(); 034 035 036 if (mEnableCallback != null) 037 try 038 039 / 通过回调函数来表明是否正常启动蓝牙设备 040 mEnableCallback.onEnableResult(res ? 041 BluetoothDevice.RESULT_SUCCESS : 042 BluetoothDevice.RESULT_FAILURE); 043 catch (RemoteException e) 044 045 046 if (res) 047 m
9、IsEnabled = true; 048 mIsDiscovering = false; 049 050 Intent intent = new Intent(BluetoothIntent.ENABLED_ACTION); 051 mContext.sendBroadcast(intent); 052 053 else 054 mIsEnabled = false; 055 mIsDiscovering = false; 056 057 mEnableThread = null; 058 059 060 061 062 063 064 065 066 067 / 这个回调函数将被作为参数传
10、进bluetoothservice 里面的enable(IBluetoothDeviceCallback callback) 068 static class DeviceCallback extends IBluetoothDeviceCallback.Stub 069 Handler messageHandler; 070 071 public void setHandler(Handler handler) 072 synchronized (this) 073 messageHandler = handler; 074 075 076 077 public void onEnableR
11、esult(int result) 078 switch(result) 079 080 / 启动不成功的时候执行 081 case BluetoothDevice.RESULT_FAILURE: 082 messageHandler.sendMessage(messageHandler.obtainMessage(EVENT_FAILED_BT_ENABLE,0); 083 break; 084 085 086 087 088 / 配对完成时执行 089 public void onCreateBondingResult(String address, int result) 090 synchronized (this) 091 if (messageHandler != null) 092 if (result = BluetoothDevice.RESULT_FAILURE) 093 messageHandler.sendMessage(messageHandler.obtainMessage( 094 HANDLE_PAIRING_FAILED, address); 095