1. 程式人生 > >Android5.1藍芽電話分析及demo

Android5.1藍芽電話分析及demo

1.重要目錄及檔案

1.manager

frameworks/base/core/java/android/bluetooth/BluetoothHeadsetClient.java

frameworks/base/core/java/android/bluetooth/IBluetoothHeadsetClient.aidl

2.Bluethooth.apk

packages/apps/Bluetooth/src/com/android/bluetooth/hfp //藍芽電話服務(擴音)

packages/apps/Bluetooth/src/com/android/bluetooth/hfpclient //藍芽耳機服務

packages/apps/Bluetooth/res/values/config.xml //藍芽協議配置檔案,想用哪個配置為true即可

packages/apps/Bluetooth/src/com/android/bluetooth/btservice/Config.java //讀取藍芽協議xml配置檔案

packages/apps/Bluetooth/src/com/android/bluetooth/btservice/AdapterService.java //啟動藍芽等服務

3.service

//manager跨程序呼叫HeadsetClientStateMachine服務

packages/apps/Bluetooth/src/com/android/bluetooth/hfpclient/HeadsetClientService.java 

//HeadsetClientStateMachine服務通過jni呼叫C/C++通訊


packages/apps/Bluetooth/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachine.java 

4.hal

external/bluetooth/bluedroid/btif/src/bluetooth.c

struct hw_module_t HAL_MODULE_INFO_SYM = {

  .id = BT_HARDWARE_MODULE_ID,

  .methods = &bt_stack_module_methods

};

5.kernel

kernel/net/rfkill/rfkill.c

module_init(rfkill_xx_init);                                                                        

|

2.藍芽耳機服務:HeadsetClientService的connect()呼叫流程

<1>frameworks/base/core/java/android/bluetooth/BluetoothHeadsetClient.java

privateIBluetoothHeadsetClientmService;

publicbooleanconnect(BluetoothDevicedevice) {

    return mService.connect(device);

}

<2>packages/apps/Bluetooth/src/com/android/bluetooth/hfpclient/HeadsetClientService.java

import android.bluetooth.IBluetoothHeadsetClient;

import android.bluetooth.BluetoothHeadsetClient;

private static class BluetoothHeadsetClientBinder extendsIBluetoothHeadsetClient.Stub implementsIProfileServiceBinder {

       private HeadsetClientService mService;

 public BluetoothHeadsetClientBinder(HeadsetClientService svc) {

         mService = svc;//HeadsetClientService svc

       }

 private HeadsetClientService getService() {

          return mService;//mService = svc

       }

       @Override

       public boolean connect(BluetoothDevice device) {

         HeadsetClientService service = getService();

         return service.connect(device);//HeadsetClientService service

       }}

public boolean connect(BluetoothDevice device) {

   mStateMachine.sendMessage(HeadsetClientStateMachine.CONNECT, device);//傳送訊息:CONNECT

   return true;

}

<3>packages/apps/Bluetooth/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachine.java

private native booleanconnectNative(byte[] address);

@Override

public synchronized boolean processMessage(Message message){

      switch (message.what){

      case CONNECT:

      if (!connectNative(getByteAddress(device))){

         ...

      }

  }

}

<4>packages/apps/Bluetooth/jni/com_android_bluetooth_hfpclient.cpp

static jbooleanconnectNative(JNIEnv *env, jobject object, jbyteArray address) {

      status =sBluetoothHfpClientInterface->connect((bt_bdaddr_t *)addr)

}

<5>external/bluetooth/bluedroid/btif/src/btif_hf_client.c

static const bthf_client_interface_t bthfClientInterface = {

  sizeof(bthf_client_interface_t),

  .init = init,

.connect =connect,

  ...

}

<5>kernel/net/rfkill/input.c

static struct input_handler rfkill_handler = {

    ...

    .connect =rfkill_connect,

};

3.撥打電話demo

private BluetoothHeadsetClient mHfpClient;

BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

bluetoothAdapter.getProfileProxy(this, mHandsFreeServiceListener, BluetoothProfile.HEADSET_CLIENT);

private BluetoothProfile.ServiceListener mHandsFreeServiceListener = new BluetoothProfile.ServiceListener(){

   @Override

   public void onServiceConnected(int profile, BluetoothProfile proxy) {

   if(profile == BluetoothProfile.HEADSET_CLIENT){

          Log.e(TAG,"HEADSET_CLIENT proxy ========= "+ String.valueOf(proxy));

          mHfpClient = (BluetoothHeadsetClient)proxy;

          List<BluetoothDevice> devices = mHfpClient.getConnectedDevices();

      for(BluetoothDevice device : devices){

               mHfpClient.dial(device_test,"10086");//撥號

           }

        }

     }

  @Override

  public void onServiceDisconnected(int profile){

  if (profile == BluetoothProfile.HEADSET_CLIENT)) {

          mHfpClient = null;

     }

    }

}




相關推薦

Android5.1電話分析demo

1.重要目錄及檔案 1.manager frameworks/base/core/java/android/bluetooth/BluetoothHeadsetClient.java frameworks/base/core/java/android/bluetooth/

android5.1 子系統介紹(一)Android下bluedroid、bluetooth apk介紹

前言本文件主要介紹android平臺下bluetooth的應用層軟體,先介紹bluetooth應用層的框架,接著分別介紹Bluedroid層軟體、Bluetooth應用程式(Bluetooth.apk),Bluetooth framework層,最後完整分析一些藍芽的操作流程。基於android 5.1的平臺

android5.1反向控制(Avrcp協議)流程

  private BluetoothAvrcpController mAvrcpController;   List<BluetoothDevice> devices = mAvrcpController.getConnectedDevices();    for(BluetoothDevice

android4.0BLE2.0 2.1 apk 串列埠助手帶16個自定義按鍵和自定義指令 字元接收 十六進位制或字元傳送

android藍芽4.0BLE apk 帶16個自定義按鍵和自定義指令 字元接收 https://pan.baidu.com/s/1eRSfprO android藍芽2.0 2.1 apk 帶16個自定義按鍵和自定義指令 字元接收  帶自動連線 https://pan.b

Synchronized 鎖重入分析Demo實現

關鍵字synchronized擁有鎖重入的功能,也就是在使用synchronized時,當一個執行緒得到一個物件鎖後,再次請求此物件鎖時是再次得到該物件的鎖的,這也證明在一個synchronized方法 / 塊內部呼叫本類的其他synchronized方法 / 塊時,是永遠可以得到鎖的。

協議分析_BLE連線有關的技術分析

1. 前言 瞭解藍芽的人都知道,在經典藍芽中,保持連線(Connection)是一個相當消耗資源(power和頻寬)的過程。特別是當沒有資料傳輸的時候,所消耗的資源完全被浪費了。因而,對很多藍芽裝置來說(特別是功耗敏感的裝置),希望在無數可傳的時候,能夠斷開連線。但是,由於

協議分析(11)_BLE安全機制之SM

1. 前言 注1:此SM是Security Manager的縮寫,非彼SM,大家不要理解歪了! 書接上文,我們在中介紹了BLE安全機制中的終極武器----資料加密。不過使用這把武器有個前提,那就是雙方要共同擁有一個加密key(LTK,Long Term Key)。這個

Stuts2學習筆記(1):環境搭建Demo

原始碼: github: https://github.com/liaotuo/Struts2-Demo/tree/master/struts2-demo 環境搭建 下載struts2 官網下載:http://mirror.bit.edu.cn/apache/struts

協議分析(8)_BLE安全機制之白名單

前言 在萬物聯網的時代,安全問題將會受到非常嚴峻的挑戰(相應地,也會獲得最大的關注度),因為我們身邊的每一個IOT裝置,都是一個處於封印狀態的天眼,隨時都有被開啟的危險。想想下面的場景吧: 凌晨2點,x米手環的鬧鐘意外啟動,將你從睡夢中驚醒,然後床頭的燈光忽明忽暗……

協議分析(6)_BLE地址型別

前言 也許關注BLE的同學都注意到了,BLE裝置有多種型別的裝置地址,如Public Device Address、Random Device Address、Static Device Address、Private Device Address等等。如果不瞭解內情,大家肯定會被

協議分析(9)_BLE安全機制之LL Privacy

前言 在上一篇文章[1]中,我們介紹了BLE的白名單機制,這是一種通過地址進行簡單的訪問控制的安全機制。同時我們也提到了,這種安全機制只防君子,不防小人,試想這樣一種場景: A裝置表示只信任B、C、D裝置,因此就把它們的地址加入到了自己的白名單中,表示只願意和它們溝通。與此

IPhone MFI認證分析

一、開發專案:藍芽解碼槍     公司近期立項開發藍芽解碼槍專案,該專案通過解碼槍終端掃描解碼,然後通過藍芽將資料傳送到手機(基於安卓,IOS系統)。目前已經完成了安卓裝置的APP開發工作,支援大多數的主流安卓裝置(主要安卓各廠商的藍芽不同,完全相容希望不大),然後打算繼續

在Android4.2中實現bluetooth A2dp Sink(二)——移植Android5.0協議棧

    在Android中,藍芽系統的結構如下圖所示:     在這個體系結構中,從下往上依次是模組驅動、藍芽協議棧、Bluetooth.apk、Framework和各種藍芽應用。其中,核心中的驅動是直接和硬體打交道的,一般由模組廠商提供。Android層中,最下面的是處

在Android4.2中實現bluetooth A2dp Sink(一)——移植Android5.0協議棧

    一直以來,Android對於藍芽的支援都很混亂,簡直可以說是一坨shit。各個版本的協議棧都不一樣,最早用的是bluez,進入4.x時代之後,換成了谷歌自己的bluedroid。換就換吧,至少等做完了再用吧,結果4.2、4.3、4.4的bluedroid全都不一樣。

Android原始碼分析——BTA層訊息分發

這裡BTA是Bluetooth Application的縮寫,從上層下來的請求都要經過這個BTA層,通過傳送訊息的方式將請求丟到BTA層中處理。這個傳送訊息的函式定義在bta_sys_main.c中,如下: void bta_sys_sendmsg(voi

Android5.1網路切換策略分析

最近在在5.1移植了乙太網過來,移植的過程並沒有什麼大問題,修改了框架上的代以及添加了Settings程式碼,乙太網除錯就基本完工了,後面只是修改下佈局即可。但是網路切換策略就有所變化了,就不得不重新認識5.1的網路切換策略了。 在android4.4上,想實

Android平臺程式設計之聊天分析(二)

接著上一篇沒有完成的任務,我們繼續分析這個藍芽聊天程式的實現,本文主要包括以下兩個部分的內容:其一,分析掃描裝置部分DeviceListActivity,其二,分析具體的聊天過程的完整通訊方案,包括埠監聽、連結配對、訊息傳送和接收等,如果有對上一篇文章不太熟悉的,可以返回

Android BroadcastReceiver + 狀態監聽Demo

1、BroadcastReceiver基礎 動態註冊 靜態註冊 動態繫結 動態登出 實現靜態登出【其實就是設定不去響應,並沒有所謂登出】 2、程式碼走起 MyBroadcast: 會在MianActivity中使用程式碼動態註冊它 package

Android5.1 內建第三方APKAndroid.mk檔案編寫(以在amlogic5.1公版系統內建百度輸入法為例)

Android.mk檔案用來向編譯系統描述如何編譯你的原始碼。在編譯整個工程的情況下,系統所找到的所有的Android.mk將會先存入subdir_makefiles變數中,隨後一次性一次性include進整個編譯檔案中。 示例 Android.mk內容:

API介紹基本功能實現

本文已授權微信公眾號fanfan程式媛獨家釋出 ONE,傳統藍芽 BluetoothAdapter:本地藍芽裝置介面卡,用於管理藍芽的開啟/關閉、重新命名、掃描、配對、連線BluetoothClass:藍芽裝置類,用於描述藍芽裝置型別BluetoothDevice:遠端