国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁 > news >正文

php律師網(wǎng)站源碼推廣計劃方案模板

php律師網(wǎng)站源碼,推廣計劃方案模板,做a的網(wǎng)站有哪些,做動態(tài)網(wǎng)站該看的書轉(zhuǎn)自:http://blog.csdn.net/baimy1985/article/details/8922508 4.2的藍(lán)牙打開流程這一部分還是有些變化的,從界面上看藍(lán)牙開關(guān)就是設(shè)置settings里那個switch開關(guān),widget開關(guān)當(dāng)然也可以,起點(diǎn)不同而已,后續(xù)的流程是一樣…

轉(zhuǎn)自:http://blog.csdn.net/baimy1985/article/details/8922508

?

4.2的藍(lán)牙打開流程這一部分還是有些變化的,從界面上看藍(lán)牙開關(guān)就是設(shè)置settings里那個switch開關(guān),widget開關(guān)當(dāng)然也可以,起點(diǎn)不同而已,后續(xù)的流程是一樣的。先來看systemServer.java的代碼,藍(lán)牙服務(wù)開啟的地方,最后一個else分支是我們關(guān)心的,前兩個是模擬器的一個測試模式的。

[java] view plain copy print ?
  1. if?(SystemProperties.get("ro.kernel.qemu").equals("1"))?{????????????????????????????????????????????
  2. ???????????????Slog.i(TAG,?"No?Bluetooh?Service?(emulator)");?????????????????????????????????????
  3. ???????????}?else?if?(factoryTest?==?SystemServer.FACTORY_TEST_LOW_LEVEL)?{???????????????????????
  4. ???????????????Slog.i(TAG,?"No?Bluetooth?Service?(factory?test)");????????????????????????????????
  5. ???????????}?else?{???????????????????????????????????????????????????????????????????????????????
  6. ???????????????Slog.i(TAG,?"Bluetooth?Manager?Service");??????????????????????????????????????????
  7. ???????????????bluetooth?=?new?BluetoothManagerService(context);??????????????????????????????????
  8. ???????????????ServiceManager.addService(BluetoothAdapter.BLUETOOTH_MANAGER_SERVICE,?bluetooth);??
  9. ???????????}?????
 if (SystemProperties.get("ro.kernel.qemu").equals("1")) {                                          
Slog.i(TAG, "No Bluetooh Service (emulator)");                                   
} else if (factoryTest == SystemServer.FACTORY_TEST_LOW_LEVEL) {                     
Slog.i(TAG, "No Bluetooth Service (factory test)");                              
} else {                                                                             
Slog.i(TAG, "Bluetooth Manager Service");                                        
bluetooth = new BluetoothManagerService(context);                                
ServiceManager.addService(BluetoothAdapter.BLUETOOTH_MANAGER_SERVICE, bluetooth);
}   

? ? ? ? ?暫且看下bluetoothManagerService的構(gòu)造方法,代碼有點(diǎn)多,我們只看兩個地方,?loadStoredNameAndAddress()是讀取藍(lán)牙打開默認(rèn)名稱的地方,isBluetoothPersistedStateOn()是判斷是否已打開藍(lán)牙的,如果已打開,后續(xù)操作要執(zhí)行開啟藍(lán)牙的動作,前面那幾行注冊廣播其中就有這個作用。

[java] view plain copy print ?
  1. BluetoothManagerService(Context?context)?{??
  2. ????????...一些變量聲明初始化...??
  3. ????????IntentFilter?filter?=?new?IntentFilter(Intent.ACTION_BOOT_COMPLETED);??
  4. ????????filter.addAction(BluetoothAdapter.ACTION_LOCAL_NAME_CHANGED);??
  5. ????????filter.addAction(Intent.ACTION_USER_SWITCHED);??
  6. ????????registerForAirplaneMode(filter);??
  7. ????????mContext.registerReceiver(mReceiver,?filter);??
  8. ????????loadStoredNameAndAddress();??
  9. ????????if?(isBluetoothPersistedStateOn())?{??
  10. ????????????mEnableExternal?=?true;??
  11. ????????}??
  12. ????}??
BluetoothManagerService(Context context) {
...一些變量聲明初始化...
IntentFilter filter = new IntentFilter(Intent.ACTION_BOOT_COMPLETED);
filter.addAction(BluetoothAdapter.ACTION_LOCAL_NAME_CHANGED);
filter.addAction(Intent.ACTION_USER_SWITCHED);
registerForAirplaneMode(filter);
mContext.registerReceiver(mReceiver, filter);
loadStoredNameAndAddress();
if (isBluetoothPersistedStateOn()) {
mEnableExternal = true;
}
}


?

? ? ? ? 回到界面開關(guān)那個看得著的地方,界面上開關(guān)就是BluetoothEnabler.java這個類了,而setBluetoothEnabled()則是具體開關(guān)動作??聪麓a

[java] view plain copy print ?
  1. public?void?onCheckedChanged(CompoundButton?buttonView,?boolean?isChecked)?{??
  2. ???????//?Show?toast?message?if?Bluetooth?is?not?allowed?in?airplane?mode ??
  3. ???????if?(isChecked?&&??
  4. ???????????????!WirelessSettings.isRadioAllowed(mContext,?Settings.Global.RADIO_BLUETOOTH))?{??
  5. ???????????Toast.makeText(mContext,?R.string.wifi_in_airplane_mode,?Toast.LENGTH_SHORT).show();??
  6. ???????????//?Reset?switch?to?off ??
  7. ???????????buttonView.setChecked(false);????????????
  8. ???????}??
  9. ??
  10. ???????if?(mLocalAdapter?!=?null)?{??
  11. ???????????mLocalAdapter.setBluetoothEnabled(isChecked);??
  12. ???????}??
  13. ???????mSwitch.setEnabled(false);??
  14. ???}??
 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// Show toast message if Bluetooth is not allowed in airplane mode
if (isChecked &&
!WirelessSettings.isRadioAllowed(mContext, Settings.Global.RADIO_BLUETOOTH)) {
Toast.makeText(mContext, R.string.wifi_in_airplane_mode, Toast.LENGTH_SHORT).show();
// Reset switch to off
buttonView.setChecked(false);          
}
if (mLocalAdapter != null) {
mLocalAdapter.setBluetoothEnabled(isChecked);
}
mSwitch.setEnabled(false);
}

這里在判斷是飛行模式不知道為什么沒有return,如果是飛行模式會有提示toast彈出,既然這樣源碼為什么還要執(zhí)行下面打開流程呢,也許是個bug?不細(xì)究這個了,繼續(xù)看setBluetoothEnabled()方法做什么了,很明顯mLocalAdapter(LocalBluetoothAdapter )只是個過渡,里面的?mAdapter(BluetoothAdapter)才是真正的主角,代碼如下:

[java] view plain copy print ?
  1. public?void?setBluetoothEnabled(boolean?enabled)?{??
  2. ????boolean?success?=?enabled?????mAdapter.enable()?:?mAdapter.disable();??
  3. ??
  4. ????if?(success)?{??
  5. ????????setBluetoothStateInt(enabled??
  6. ??????????????BluetoothAdapter.STATE_TURNING_ON??
  7. ????????????:?BluetoothAdapter.STATE_TURNING_OFF);??
  8. ????}?else?{??
  9. ???????.........??
  10. ????}??
  11. }??
    public void setBluetoothEnabled(boolean enabled) {
boolean success = enabled   ? mAdapter.enable() : mAdapter.disable();
if (success) {
setBluetoothStateInt(enabled
? BluetoothAdapter.STATE_TURNING_ON
: BluetoothAdapter.STATE_TURNING_OFF);
} else {
.........
}
}

? ? ? ? 在BluetoothAdapter.java里可以看到一個單例模式的應(yīng)用,主要提供給其它程序調(diào)用藍(lán)牙的一些方法用的,外部程序想調(diào)用藍(lán)牙的方法就要先用這個

拿到BluetoothAdapter對象,代碼也簡單看下吧,里面是典型的binder應(yīng)用。

[java] view plain copy print ?
  1. public?static?synchronized?BluetoothAdapter?getDefaultAdapter()?{??
  2. ???if?(sAdapter?==?null)?{??
  3. ???????IBinder?b?=?ServiceManager.getService(BLUETOOTH_MANAGER_SERVICE);??
  4. ???????if?(b?!=?null)?{??
  5. ???????????IBluetoothManager?managerService?=?IBluetoothManager.Stub.asInterface(b);??
  6. ???????????sAdapter?=?new?BluetoothAdapter(managerService);??
  7. ???????}?else?{??
  8. ???????????Log.e(TAG,?"Bluetooth?binder?is?null");??
  9. ???????}??
  10. ???}??
  11. ???return?sAdapter;??
     public static synchronized BluetoothAdapter getDefaultAdapter() {
if (sAdapter == null) {
IBinder b = ServiceManager.getService(BLUETOOTH_MANAGER_SERVICE);
if (b != null) {
IBluetoothManager managerService = IBluetoothManager.Stub.asInterface(b);
sAdapter = new BluetoothAdapter(managerService);
} else {
Log.e(TAG, "Bluetooth binder is null");
}
}
return sAdapter;
}

? ? ? ? 此時我們更關(guān)心mAdapter.enable()的后續(xù)操作,外部其它應(yīng)用到getDefaultAdapter()也是調(diào)用enable(),注意,到了BluetoothAdapter我們已經(jīng)在framework層了,順著BluetoothAdapter.java的enable()調(diào)用先回到BluetoothManagerService.java的enable(),再進(jìn)一步來到BluetoothManagerService.java中的handleEnable()

方法,后面要跳轉(zhuǎn)到新類了,貼出來一起看下,這部分好像不同版本還有些出入,不過核心的啟動service是一樣的,不影響理解。

[java] view plain copy print ?
  1. ?private?void?handleEnable(boolean?persist,?boolean?quietMode)?{??
  2. ?synchronized(mConnection)?{??
  3. ????if?((mBluetooth?==?null)?&&?(!mBinding))?{??
  4. ????????//Start?bind?timeout?and?bind ??
  5. ????????Message?timeoutMsg=mHandler.obtainMessage(MESSAGE_TIMEOUT_BIND);??
  6. ????????mHandler.sendMessageDelayed(timeoutMsg,TIMEOUT_BIND_MS);??
  7. ????????mConnection.setGetNameAddressOnly(false);??
  8. ????????Intent?i?=?new?Intent(IBluetooth.class.getName());??
  9. ????????if?(!mContext.bindService(i,?mConnection,Context.BIND_AUTO_CREATE,??
  10. ??????????????????????????????????UserHandle.USER_CURRENT))?{??
  11. ????????????mHandler.removeMessages(MESSAGE_TIMEOUT_BIND);??
  12. ????????????Log.e(TAG,?"Fail?to?bind?to:?"?+?IBluetooth.class.getName());??
  13. ????????}?else?{??
  14. ????????????mBinding?=?true;??
  15. ????????}??
  16. ????}???
 private void handleEnable(boolean persist, boolean quietMode) {
synchronized(mConnection) {
if ((mBluetooth == null) && (!mBinding)) {
//Start bind timeout and bind
Message timeoutMsg=mHandler.obtainMessage(MESSAGE_TIMEOUT_BIND);
mHandler.sendMessageDelayed(timeoutMsg,TIMEOUT_BIND_MS);
mConnection.setGetNameAddressOnly(false);
Intent i = new Intent(IBluetooth.class.getName());
if (!mContext.bindService(i, mConnection,Context.BIND_AUTO_CREATE,
UserHandle.USER_CURRENT)) {
mHandler.removeMessages(MESSAGE_TIMEOUT_BIND);
Log.e(TAG, "Fail to bind to: " + IBluetooth.class.getName());
} else {
mBinding = true;
}
}?

? ? ? ?下面跑到哪個service里去了呢,在log信息里可以看到"ActivityManager: Start proc com.android.bluetooth for service com.android.bluetooth/.btservice.AdapterService:"

這樣的信息,那就是去AdapterService里看看,里面一共有三個enable(),跳轉(zhuǎn)關(guān)系不復(fù)雜,我們直接看最后一個關(guān)鍵的。

[java] view plain copy print ?
  1. public?synchronized?boolean?enable(boolean?quietMode)?{??
  2. ?????enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM,??
  3. ?????????????"Need?BLUETOOTH?ADMIN?permission");??
  4. ?????if?(DBG)debugLog("Enable?called?with?quiet?mode?status?=??"?+?mQuietmode);??
  5. ?????mQuietmode??=?quietMode;??
  6. ?????Message?m?=??
  7. ?????????????mAdapterStateMachine.obtainMessage(AdapterState.USER_TURN_ON);??
  8. ?????mAdapterStateMachine.sendMessage(m);??
  9. ?????return?true;??
  10. ?}??
    public synchronized boolean enable(boolean quietMode) {
enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM,
"Need BLUETOOTH ADMIN permission");
if (DBG)debugLog("Enable called with quiet mode status =  " + mQuietmode);
mQuietmode  = quietMode;
Message m =
mAdapterStateMachine.obtainMessage(AdapterState.USER_TURN_ON);
mAdapterStateMachine.sendMessage(m);
return true;
}

?狀態(tài)機(jī)來了,狀態(tài)轉(zhuǎn)換圖,從一個狀態(tài)接受命令跳到另一個狀態(tài),因?yàn)槲覀兪窃陂_啟藍(lán)牙,所以先去的AdapterState.java內(nèi)部類offstate.java里面找,在這個分支USER_TURN_ON看到mAdapterService.processStart();在這里面可以看到藍(lán)牙遍歷下所支持的profile,最后又發(fā)出個帶AdapterState.STARTED標(biāo)識的消息

處理在同文件下面的代碼里

[java] view plain copy print ?
  1. case?STARTED:???{??
  2. ??if?(DBG)?Log.d(TAG,"CURRENT_STATE=PENDING,?MESSAGE?=?STARTED,?isTurningOn="?+?isTurningOn?+?",?isTurningOff="?+?isTurningOff);??
  3. ??//Remove?start?timeout ??
  4. ??removeMessages(START_TIMEOUT);??
  5. ??
  6. ??//Enable ??
  7. ??boolean?ret?=?mAdapterService.enableNative();??
  8. ??if?(!ret)?{??
  9. ??????Log.e(TAG,?"Error?while?turning?Bluetooth?On");??
  10. ??????notifyAdapterStateChange(BluetoothAdapter.STATE_OFF);??
  11. ??????transitionTo(mOffState);??
  12. ??}?else?{??
  13. ??????sendMessageDelayed(ENABLE_TIMEOUT,?ENABLE_TIMEOUT_DELAY);??
  14. ??}???
      case STARTED:   {
if (DBG) Log.d(TAG,"CURRENT_STATE=PENDING, MESSAGE = STARTED, isTurningOn=" + isTurningOn + ", isTurningOff=" + isTurningOff);
//Remove start timeout
removeMessages(START_TIMEOUT);
//Enable
boolean ret = mAdapterService.enableNative();
if (!ret) {
Log.e(TAG, "Error while turning Bluetooth On");
notifyAdapterStateChange(BluetoothAdapter.STATE_OFF);
transitionTo(mOffState);
} else {
sendMessageDelayed(ENABLE_TIMEOUT, ENABLE_TIMEOUT_DELAY);
} 


看到那個enableNative()函數(shù)調(diào)用了吧,又要用到JNI了,稍微回頭看下前面的代碼,我們先從應(yīng)用界面開關(guān)BluetoothEnabler走到framework的BluetoothAdapter,又回到package的adapterService,現(xiàn)在又要去JNI的C++代碼了,往常一般是packages -->framework-->下面一層,這次順序有些顛倒了,不過這不能影響我們跟蹤代碼,最后

還是要到下面去的。一起往下看吧。

? ? ? ? 根據(jù)android JNI的函數(shù)命名慣例很容易找到enableNative對應(yīng)的C++函數(shù)在packages/apps/Bluetooth/jni/com_android_bluetooth_btservice_AdapterService.cpp里面

[java] view plain copy print ?
  1. static?jboolean?enableNative(JNIEnv*?env,?jobject?obj)?{??
  2. ???ALOGV("%s:",__FUNCTION__);??
  3. ???jboolean?result?=?JNI_FALSE;??
  4. ????if?(!sBluetoothInterface)?return?result;??
  5. ????int?ret?=?sBluetoothInterface->enable();??
  6. ????result?=?(ret?==?BT_STATUS_SUCCESS)???JNI_TRUE?:?JNI_FALSE;??
  7. ????return?result;??
  8. }??
static jboolean enableNative(JNIEnv* env, jobject obj) {
ALOGV("%s:",__FUNCTION__);
jboolean result = JNI_FALSE;
if (!sBluetoothInterface) return result;
int ret = sBluetoothInterface->enable();
result = (ret == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE;
return result;
}


?

代碼瞬間簡潔了不少,看來更多的故事還在下面,sBluetoothInterface這是什么,直接關(guān)系到下一步去哪的問題,看下變量聲明,原來是

Const bt_interface_t *sBluetoothInterface = NULL; 再去找在哪初始化,搜索external目錄可以找到/external/bluetooth/bluedroid/btif/src/bluetooth.c

[cpp] view plain copy print ?
  1. ????static?const?bt_interface_t?bluetoothInterface?=?{??
  2. ????sizeof(bt_interface_t),??
  3. ????init,??
  4. ????enable,??
  5. ????disable,??
  6. ????.............??
  7. ????start_discovery,??
  8. ????cancel_discovery,??
  9. ????create_bond,??
  10. ????remove_bond,??
  11. ????cancel_bond,??
  12. ???...............??
  13. };??
    static const bt_interface_t bluetoothInterface = {
sizeof(bt_interface_t),
init,
enable,
disable,
.............
start_discovery,
cancel_discovery,
create_bond,
remove_bond,
cancel_bond,
...............
};

原來在這里,說下怎么找到,直接跳轉(zhuǎn)是不成了,看這個文件夾下的mk文件,那里面有l(wèi)ibhardware目錄是編譯的時候要用到,這個多半在hardware目錄里,在這里面很快可以看到bluetooth.h,那里面有最我們要找的結(jié)構(gòu)體定義,頭文件找到了,再找同名C文件就快了,好了繼續(xù)吧看下enable()里是怎么實(shí)現(xiàn)的

[cpp] view plain copy print ?
  1. static?int?enable(?void?)??
  2. {??
  3. ????ALOGI("enable");??
  4. ??
  5. ????/*?sanity?check?*/??
  6. ????if?(interface_ready()?==?FALSE)??
  7. ????????return?BT_STATUS_NOT_READY;??
  8. ??
  9. ????return?btif_enable_bluetooth();??
  10. }??
static int enable( void )
{
ALOGI("enable");
/* sanity check */
if (interface_ready() == FALSE)
return BT_STATUS_NOT_READY;
return btif_enable_bluetooth();
}

又是一個新函數(shù),直接跳轉(zhuǎn),比起剛才的尋覓這太幸福了

[cpp] view plain copy print ?
  1. bt_status_t?btif_enable_bluetooth(void)??
  2. {??
  3. ????BTIF_TRACE_DEBUG0("BTIF?ENABLE?BLUETOOTH");??
  4. ??
  5. ????if?(btif_core_state?!=?BTIF_CORE_STATE_DISABLED)??
  6. ????{??
  7. ????????ALOGD("not?disabled\n");??
  8. ????????return?BT_STATUS_DONE;??
  9. ????}??
  10. ??
  11. ????btif_core_state?=?BTIF_CORE_STATE_ENABLING;??
  12. ??
  13. ????/*?Create?the?GKI?tasks?and?run?them?*/??
  14. ????bte_main_enable(btif_local_bd_addr.address);??
  15. ??
  16. ????return?BT_STATUS_SUCCESS;??
  17. }??
bt_status_t btif_enable_bluetooth(void)
{
BTIF_TRACE_DEBUG0("BTIF ENABLE BLUETOOTH");
if (btif_core_state != BTIF_CORE_STATE_DISABLED)
{
ALOGD("not disabled\n");
return BT_STATUS_DONE;
}
btif_core_state = BTIF_CORE_STATE_ENABLING;
/* Create the GKI tasks and run them */
bte_main_enable(btif_local_bd_addr.address);
return BT_STATUS_SUCCESS;
}

忘了寫路徑了 好在可以直接跳轉(zhuǎn),下面是/external/bluetooth/bluedroid/main/bte_main.c,有點(diǎn)長,暫時只關(guān)心set_power那部分就好了,

[cpp] view plain copy print ?
  1. void?bte_main_enable(uint8_t?*local_addr)??
  2. {??
  3. ????APPL_TRACE_DEBUG1("%s",?__FUNCTION__);??
  4. ????........................??
  5. ??
  6. #if?(defined?(BT_CLEAN_TURN_ON_DISABLED)?&&?BT_CLEAN_TURN_ON_DISABLED?==?TRUE) ??
  7. ????????APPL_TRACE_DEBUG1("%s??Not?Turninig?Off?the?BT?before?Turninig?ON",?__FUNCTION__);??
  8. ??
  9. #else ??
  10. ????????/*?toggle?chip?power?to?ensure?we?will?reset?chip?in?case?
  11. ???????????a?previous?stack?shutdown?wasn't?completed?gracefully?*/??
  12. ????????bt_hc_if->set_power(BT_HC_CHIP_PWR_OFF);??
  13. #endif ??
  14. ????????bt_hc_if->set_power(BT_HC_CHIP_PWR_ON);??
  15. ??
  16. ????????bt_hc_if->preload(NULL);??
  17. ????}??
  18. ??
  19. ?????.............................??
  20. }??
void bte_main_enable(uint8_t *local_addr)
{
APPL_TRACE_DEBUG1("%s", __FUNCTION__);
........................
#if (defined (BT_CLEAN_TURN_ON_DISABLED) && BT_CLEAN_TURN_ON_DISABLED == TRUE)
APPL_TRACE_DEBUG1("%s  Not Turninig Off the BT before Turninig ON", __FUNCTION__);
#else
/* toggle chip power to ensure we will reset chip in case
a previous stack shutdown wasn't completed gracefully */
bt_hc_if->set_power(BT_HC_CHIP_PWR_OFF);
#endif
bt_hc_if->set_power(BT_HC_CHIP_PWR_ON);
bt_hc_if->preload(NULL);
}
.............................
}

路徑在這里/external/bluetooth/bluedroid/hci/src/bt_hci_bdroid.c,看看set_power里面有什么,快到頭了

[cpp] view plain copy print ?
  1. static?void?set_power(bt_hc_chip_power_state_t?state)??
  2. {??
  3. ????int?pwr_state;??
  4. ??
  5. ????BTHCDBG("set_power?%d",?state);??
  6. ??
  7. ????/*?Calling?vendor-specific?part?*/??
  8. ????pwr_state?=?(state?==?BT_HC_CHIP_PWR_ON)???BT_VND_PWR_ON?:?BT_VND_PWR_OFF;??
  9. ??
  10. ????if?(bt_vnd_if)??
  11. ????????bt_vnd_if->op(BT_VND_OP_POWER_CTRL,?&pwr_state);??
  12. ????else??
  13. ????????ALOGE("vendor?lib?is?missing!");??
  14. }??
static void set_power(bt_hc_chip_power_state_t state)
{
int pwr_state;
BTHCDBG("set_power %d", state);
/* Calling vendor-specific part */
pwr_state = (state == BT_HC_CHIP_PWR_ON) ? BT_VND_PWR_ON : BT_VND_PWR_OFF;
if (bt_vnd_if)
bt_vnd_if->op(BT_VND_OP_POWER_CTRL, &pwr_state);
else
ALOGE("vendor lib is missing!");
}

? ? ? ? 這下又有新東西了bt_vnd_if,這個是什么,bt_vendor_interface_t *bt_vnd_if=NULL;和剛才的bt_interface_t 一樣,我們希望可以找到它的初始化,那樣就可以繼續(xù)跟蹤了,不過看到下面的代碼和注釋,在源碼中我們要絕望了。路徑:/external/bluetooth/bluedroid/hci/include/bt_vendor_lib.h

[cpp] view plain copy print ?
  1. /*?Entry?point?of?DLib?--?
  2. ?*??????Vendor?library?needs?to?implement?the?body?of?bt_vendor_interface_t?
  3. ?*??????structure?and?uses?the?below?name?as?the?variable?name.?HCI?library?
  4. ?*??????will?use?this?symbol?name?to?get?address?of?the?object?through?the?
  5. ?*??????dlsym?call.?
  6. ?*/??
  7. extern?const?bt_vendor_interface_t?BLUETOOTH_VENDOR_LIB_INTERFACE;??
  8. ??
  9. bt_vendor_interface_t?*bt_vnd_if=NULL;??
/* Entry point of DLib --
*      Vendor library needs to implement the body of bt_vendor_interface_t
*      structure and uses the below name as the variable name. HCI library
*      will use this symbol name to get address of the object through the
*      dlsym call.
*/
extern const bt_vendor_interface_t BLUETOOTH_VENDOR_LIB_INTERFACE;
bt_vendor_interface_t *bt_vnd_if=NULL;


?google定義好了接口,具體實(shí)現(xiàn)要看vendor廠商來做了,這后面怎么實(shí)現(xiàn)就看各家芯片商怎么寫了,肯定各有不同,而且這一部分代碼一般是不會公開,當(dāng)然授權(quán)購買后除外了。所以在4.2的源碼中我們只跟到這里了,那后面會做什么呢,加載驅(qū)動和上電這兩項(xiàng)肯定要有了,打開藍(lán)牙沒這兩步怎么行,類似下面的字符串

[cpp] view plain copy print ?
  1. static?const?char*?BT_DRIVER_MODULE_PATH?=????"/system/lib/modules/mbt8xxx.ko";??
  2. static?const?char*?BT_DRIVER_MODULE_NAME?=?????"bt8xxx";??
  3. static?const?char*?BT_DRIVER_MODULE_INIT_ARG?=?"?init_cfg=";??
  4. static?const?char*?BT_DRIVER_MODULE_INIT_CFG_PATH?=?"bt_init_cfg.conf";??
static const char* BT_DRIVER_MODULE_PATH =    "/system/lib/modules/mbt8xxx.ko";
static const char* BT_DRIVER_MODULE_NAME =     "bt8xxx";
static const char* BT_DRIVER_MODULE_INIT_ARG = " init_cfg=";
static const char* BT_DRIVER_MODULE_INIT_CFG_PATH = "bt_init_cfg.conf";

在有類似下面的動作,insmod加載驅(qū)動,rfkill控制上下電,具體廠商具體做法也不同。

[cpp] view plain copy print ?
  1. ret?=?insmod(BT_DRIVER_MODULE_PATH,?arg_buf);??
  2. ret?=?system("/system/bin/rfkill?block?all");??
ret = insmod(BT_DRIVER_MODULE_PATH, arg_buf);
ret = system("/system/bin/rfkill block all");

? ? ? ?寫到這,關(guān)于4.2源碼的藍(lán)牙打開流程就算結(jié)束了,比起4.1之前的代碼感覺沒有以前的直觀,對于vendor那部分的代碼大家只能看各自廠商的代碼了,一般藍(lán)牙開啟后才會上電,這樣也比較符合邏輯和節(jié)省電量,是否上電可以連上手機(jī)用adb shell看sys/class/rfkill目錄下的state狀態(tài)值,有些廠商會把藍(lán)牙和wifi的上電算在一起,這個也是要注意的,小心誤判。最后呢,這次文章寫得有點(diǎn)倉促,寫錯的或遺漏地方希望朋友指出來,非常感謝。



?

http://m.aloenet.com.cn/news/40642.html

相關(guān)文章:

  • 吳中區(qū)企業(yè)網(wǎng)站制作哪家靠譜seo常用工具網(wǎng)站
  • 西安網(wǎng)站制作sxyun淘寶seo搜索優(yōu)化
  • 制作php網(wǎng)站用什么軟件手機(jī)百度網(wǎng)址大全首頁
  • 叫人做網(wǎng)站要注意軟件開發(fā)公司
  • 福田網(wǎng)站開發(fā)北京seo營銷培訓(xùn)
  • 廣西住房建設(shè)廳網(wǎng)站廈門人才網(wǎng)官網(wǎng)招聘信息網(wǎng)
  • 深圳企業(yè)做網(wǎng)站百度賬號安全中心官網(wǎng)
  • 做學(xué)校網(wǎng)站導(dǎo)航條應(yīng)該有哪些知乎關(guān)鍵詞排名優(yōu)化工具
  • 東莞營銷型網(wǎng)站建設(shè)費(fèi)用鄭志平愛站網(wǎng)創(chuàng)始人
  • 邢臺做企業(yè)網(wǎng)站淘寶關(guān)鍵詞搜索量查詢工具
  • 網(wǎng)站建設(shè)公司yu專業(yè)百度seo排名優(yōu)化
  • 相關(guān)網(wǎng)站怎么做seo關(guān)鍵詞排名價格
  • 深圳設(shè)計網(wǎng)站培訓(xùn)學(xué)校開發(fā)一個網(wǎng)站的步驟流程
  • 重慶網(wǎng)站建設(shè) 公司列舉常見的網(wǎng)絡(luò)營銷工具
  • 團(tuán)購網(wǎng)站推廣怎么做百度搜索關(guān)鍵詞技巧
  • 合肥有多少做網(wǎng)站的優(yōu)化營商環(huán)境工作總結(jié)
  • 網(wǎng)站訪問者qq山東工藝美術(shù)學(xué)院網(wǎng)站建設(shè)公司
  • 沃爾瑪網(wǎng)上商城可以用購物卡嗎seo技術(shù)優(yōu)化整站
  • 設(shè)計師網(wǎng)站建設(shè)icp備案查詢官網(wǎng)
  • 溫州高端網(wǎng)站建設(shè)公司哪家好全球最大的磁力搜索引擎
  • 一個公司做100個網(wǎng)站人民日報官網(wǎng)
  • html5手機(jī)網(wǎng)站源碼月入百萬的游戲代理
  • eclipse 簡單網(wǎng)站開發(fā)搜索關(guān)鍵詞的方法
  • 無錫哪里做網(wǎng)站市場調(diào)研報告怎么寫
  • 企業(yè)網(wǎng)站建設(shè)西安今日熱點(diǎn)新聞事件摘抄50字
  • dedecms 網(wǎng)站地圖模板網(wǎng)絡(luò)熱詞作文
  • 用ul做的網(wǎng)站為何浮動不上去seo關(guān)鍵詞優(yōu)化費(fèi)用
  • 東莞網(wǎng)站建設(shè)網(wǎng)站建設(shè)北京百度seo關(guān)鍵詞優(yōu)化
  • 宿遷網(wǎng)站推廣網(wǎng)站排名顧問
  • 網(wǎng)站建設(shè)制作 武漢北京網(wǎng)站seo公司