资源预览内容
第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
第9页 / 共9页
亲,该文档总共9页全部预览完了,如果喜欢就下载吧!
资源描述
android 蓝牙源码分析BluetoothService 类中定义的 Native 方法都在 android_server_BluetoothServer.cpp 里建立jni 调用一、开启(BT Turn on Turn off) (蓝牙的打开关闭由类 BluetoothEnabler 控制。 )1.由 BluetoothEnabler 控制界面操作,在其构造函数里会先调用 LocalBluetoothManager.getInstance(context)。2.然后在 LocalBluetoothManager 类的 getInstance 函数里会调用当前类下的 init()函数,该init()函数中通过 BluetoothAdapter.getDefaultAdapter()获得蓝牙设备的句柄,如果当前没有蓝牙设备则返回 null。 3.初始化完毕会监听 checkbox 的状态,当触发点击 checkbox 会响应 onPreferenceChange 方法,其中将调用 LocalBluetoothManager.setBluetoothEnabled(enable)方法。而 LocalBluetoothManager.setBluetoothEnabled(enable)方法,会调用 mAdapter.enable()方法,enable()方法又会调用 BluetoothService.enable()方法。其中,(1)打开(关闭)操作成功后会有一个异步事件 ACTION_STATE_CHANGED 返回,异步事件由类 BluetoothEventRedirector 控制(接收广播,进行处理) 。在收到ACTION_STATE_CHANGED 异步事件后,还需要做 update 本地设备 profile 的事情,读取上次关闭前搜索到的蓝牙设备。(1.1)update 本地设备 profile 的事情:?(1.2)读取上次关闭前搜索到的蓝牙设备:通过 LocalBluetoothManager.setBluetoothStateInt(int state)方法调到 CachedBluetoothDeviceManager.onBluetoothStateChanged 方法来读取上次关闭之前搜索到device. (2)来开启 EnableThread 线程,进行打开操作,蓝牙的打开关闭属于异步操作。ps:在启动蓝牙的时候,要注意的地方是不能正常启动蓝牙的情况,因为正常启动的时候会返回 BluetoothIntent.ENABLED_ACTION 这个 Intent,当时当启动出现异常的时候是没有 Intent 返回的,android 使用回调函数来解决这个问题。下面是在bluetoothdeviceservice.java 里面 enable((IBluetoothDeviceCallback callback) 的过程:(以下代码属于较低版本的 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 & isAirplaneModeOn() 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 true; 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 = enableNative(); 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 mIsEnabled = 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 / 这个回调函数将被作为参数传进 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 onEnableResult(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 else 096 messageHandler.sendMessage(messageHandler.obtainMessage( 097 HANDLE_PAIRING_P
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号