アンドロイド - のBluetoothブルートゥース(5)は電話に応答し、音楽を聴きます

  コールに応答する1. Bluetoothヘッドセット

        これは、HFP(ハンズfreeProfile)の本来の意図の1つに対応し、Bluetooth対応のあなたの手を解放します。このシーン機能ではまず見て、電話、Bluetoothヘッドセットと携帯電話が接続され、その後、プロセスは、電話に答えるコードのBluetoothをトリガするために優先順位を与えるだろう、\ SRC \ COM \アンドロイド\電話connectBluetoothAudioの\ nCallScreen.java()電話でコードを開始/ disconnectBluetoothAudio()、接続部をよく見、以下のコメントコードに注意し、
[javaの]   ビュー無地 コピー
  1. / *パッケージ* /  ボイドconnectBluetoothAudio(){  
  2.   (VDBG)ログ(もし"connectBluetoothAudio()...");  
  3.   もし(mBluetoothHeadset!=  NULL){  
  4.       // TODO(BT)チェック復帰  
  5.       mBluetoothHeadset.connectAudio();  
  6.   }  
  7.   //気をつけろ:Bluetooth接続がすぐに発生しません。  
  8.   // connectAudio()の呼び出しは即座に返されますが、その本当のを行います  
  9.   //別スレッドで動作します。mBluetoothConnectionPendingフラグ  
  10.   //画面上のUIを更新することを確実にするために、ほんの少しの策略であります  
  11.   //即座に。(上記)(isBluetoothAudioConnectedOrPendingを参照してください。)  
  12.   mBluetoothConnectionPending =  はtrue。  
  13.   mBluetoothConnectionRequestTime = SystemClock.elapsedRealtime()。  
         その後、あなたは、コードパッケージ/アプリケーション/ブルートゥース/ SRC / COM /アンドロイド/ブルートゥース/ HFP / HeadsetService.java、Bluetoothアプリケーションの管轄にジャンプ
[javaの]   ビュー無地 コピー
  1. パブリック  ブールconnectAudio(){  
  2.     HeadsetServiceサービスのgetService =();  
  3.     (サービスは==場合  はnull)  を返す  場合はfalse  
  4.     service.connectAudioを返します();  
  5. }  
        もちろん、次の目標は、特定の実装を直接見、HeadsetServiceで、コードのジャンプのこの部分が比較的明確であり、次のコードでは、最初に現在のステータスを確認します正しい、いくつかの州は、/ /パッケージ/アプリケーション/ブルートゥース/ SRCを保持HeadsetStateMachineに参加することができますCOM /アンドロイド/ブルートゥース/ HFP /コードのコメントHeadsetStateMachine.javaの最も前に。
[javaの]   ビュー無地 コピー
  1. ブールconnectAudio(){  
  2.      // TODO(BT)、BluetoothやBLUETOOTH_ADMIN許可  
  3.      enforceCallingOrSelfPermission(BLUETOOTH_PERM、  "BLUETOOTH許可が必要です");  
  4.      (もし!mStateMachine.isConnected()){  
  5.          返す  偽;  
  6.      }  
  7.      IF(mStateMachine.isAudioOn()){  
  8.          返す  偽;  
  9.      }  
  10.      mStateMachine.sendMessage(HeadsetStateMachine.CONNECT_AUDIO)。  
  11.      返却  はtrue。  
  12.  }  
       ステートマシンにHeadsetStateMachine、CONNECT_AUDIO枝を見つけ、ネイティブと方法connectAudioNative(getByteAddress(mCurrentDevice))をご覧ください。
[javaの]   ビュー無地 コピー
  1. 静的jboolean connectAudioNative(JNIEnvの* ENV、jオブジェクトオブジェクト、jbyteArrayアドレス){  
  2.     jbyteの* addrの。  
  3.     ステータスbt_status_t;  
  4.   
  5.     (!sBluetoothHfpInterface)場合は、  JNI_FALSEを返します。  
  6.   
  7.     ADDR = env-> GetByteArrayElements(アドレス、NULL);  
  8.     (もし!addrの){  
  9.         jniThrowIOException(ENV、選択されました)。  
  10.         JNI_FALSEを返します。  
  11.     }  
  12. //ここに接続  
  13.     もし((ステータス= sBluetoothHfpInterface-> connect_audio((bt_bdaddr_t *)のaddr))!=    
  14.          BT_STATUS_SUCCESS){  
  15.         ALOGE("失敗したHFオーディオ接続、状態:%d個"、状態)。  
  16.     }  
  17.     env-> ReleaseByteArrayElements(アドレス、ADDR、  0);  
  18.     リターン(状態== BT_STATUS_SUCCESS)?JNI_TRUE:JNI_FALSE。  
  19. }  
       上記のコードは、ここでは、メッセージ・フローは、書き込みの後に配置されると推定されるため、実際のプロセスは、ここに上であるために、以下でさらに/external/bluetooth/bluedroid/btif/src/btif_hf.cすることができます
[javaの]   ビュー無地 コピー
  1. 静的bt_status_t connect_audio(bt_bdaddr_t * BD_ADDR)  
  2. {  
  3.     CHECK_BTHF_INIT();  
  4.     もし(is_connected(BD_ADDR))  
  5.     {  
  6.         BTA_AgAudioOpen(btif_hf_cb.handle)。  
  7.         / * *オーディオの接続が正常に開始されたアプリケーションを通知/  
  8.         btif_transfer_context(btif_in_hf_generic_evt、BTIF_HFP_CB_AUDIO_CONNECTING、  
  9.                               (CHAR *)BD_ADDR、はsizeof(bt_bdaddr_t)、NULL);  
  10.         BT_STATUS_SUCCESSを返します。  
  11.     }  
  12.     BT_STATUS_FAILを返します。  
  13. }  
 

 ブルートゥースリスト2.接続のBluetoothヘッドセット

     A2DP接続処理、それはデバイスのリストから開始されるので、これはコードの自然な開始であるため、検索結果のブルートゥース・リストにBluetoothヘッドセットを接続します
[javaの]   ビュー無地 コピー
  1. DevicePickerFragment.java(設定\ SRC \ comのアンドロイド\設定\ \ブルートゥース)      3884      2013- 6 - 26  
  2.     ボイドonClicked(){  
  3.       INT bondState = mCachedDevice.getBondState()。  
  4.       IF(mCachedDevice.isConnected()){  
  5.           askDisconnect();  
  6.       }  そう  であれば(bondState == BluetoothDevice.BOND_BONDED){  
  7.           mCachedDevice.connect(真の);  
  8.       } .......  
  9.   }  
  10.   
  11.     ボイド接続(ブールconnectAllProfiles){  
  12.       IF(!ensurePaired()){   //最初に必ずペアリングすることを作ります  
  13.           返します。  
  14.       }  
  15.       mConnectAttempted = SystemClock.elapsedRealtime()。  
  16.       connectWithoutResettingTimer(connectAllProfiles); 他に//何もない、ここでしか見ること  
  17.   }  
      コードパスどこパッケージ/アプリケーション/設定/ SRC / COM /アンドロイド/設定/ブルートゥース/ CachedBluetoothDevice.java、次の特定のコードを参照してください
[javaの]   ビュー無地 コピー
  1. //彼らがいなかった場合はプロファイルを初期化するために試してみてください。  
  2.      ...........  
  3.       //唯一のショー-1-エラーダイアログ追跡変数をリセット  
  4.       mIsConnectingErrorPossible =  はtrue。  
  5.   
  6.       int型preferredProfiles =  0;  
  7.       {(mProfiles LocalBluetoothProfileプロファイル)のために  
  8.           もし(?connectAllProfiles profile.isConnectable():profile.isAutoConnectable()){  
  9.               IF(profile.isPreferred(mDevice)){  
  10.                   ++ preferredProfiles;  
  11.                   connectInt(プロフィール); //この接続を、  
  12.               }  
  13.           }  
  14.       }  
  15.      .............  
       connectInt実装が非常に簡単である、(mDevice)profile.connect内部参照に進み、ここでプロファイルA2dpProfileを意味するので、特定Connet()メソッドに実装されています
[javaの]   ビュー無地 コピー
  1. パブリック  ブール{(BluetoothDevice装置)を接続  
  2.     (mServiceは==場合  はnull)  を返す  場合はfalse  
  3.     一覧<BluetoothDevice>シンク=のgetConnectedDevices();  
  4.     もし(シンク!=  NULL){  
  5.         {(シンクをBluetoothDeviceシンク)のために  
  6.             mService.disconnect(シンク)。  
  7.     }}  
  8.     mService.connect(デバイス)を返します。  
  9. }  
        ここでは、このプライベートBluetoothA2dp mServiceそれを見ている理由BluetoothA2dp.java(フレームワーク\ベース\コア\のJava \アンドロイド\ブルートゥース)は、であり、ノウハウ
[javaの]   ビュー無地 コピー
  1. パブリック  ブール{(BluetoothDevice装置)を接続  
  2.       (mService!=の場合  はnull && ISENABLED()&&  
  3.           isValidDevice(デバイス)){  
  4.           {試します  
  5.               mService.connect(デバイス)を返します。  
  6.           }  キャッチ(RemoteExceptionを電子){  
  7.               Log.e(TAG、  "スタック:" + Log.getStackTraceString(新しいThrowableを()));  
  8.               返す  偽;  
  9.           }  
  10.       } ...........  
  11.       返す  偽;  
  12.        
  13.       バインダージャンプ  
  14.       パブリック  ブール{(BluetoothDevice装置)を接続  
  15.           A2dpServiceサービスのgetService =();  
  16.           (サービスは==場合  はnull)  を返す  場合はfalse  
  17.           service.connect(デバイス)を返します。  
  18.       }  
  19.        
  20.   }  
        最初のジャンプの一部と同様のプロセスを答えるのBluetooth電話をジャンプが繰り返されていない、そして最後に/ com_android_bluetooth_a2dp.cpp connectA2dpNativeパッケージ/アプリケーション/ブルートゥース/ JNIに来るの後、以下のコードに同じ、私たちは、オープンを見ることができますコードは、これらには、次の特定のベンダーの真実を見ています。
[javaの]   ビュー無地 コピー
  1. 静的jboolean connectA2dpNative(JNIEnvの* ENV、jオブジェクトオブジェクト、jbyteArrayアドレス){  
  2.   jbyteの* addrの。  
  3.   bt_bdaddr_t * btAddr。  
  4.   ステータスbt_status_t;  
  5.   
  6.   ALOGI("%sの:sBluetoothA2dpInterface:%のP"、__FUNCTION__、sBluetoothA2dpInterface)。  
  7.   (!sBluetoothA2dpInterface)場合は、  JNI_FALSEを返します。  
  8.   
  9.   ADDR = env-> GetByteArrayElements(アドレス、NULL);  
  10.   btAddr =(bt_bdaddr_t *)のaddr;  
  11.   (もし!addrの){  
  12.       jniThrowIOException(ENV、選択されました)。  
  13.       JNI_FALSEを返します。  
  14.   }  
  15.   もし((ステータス= sBluetoothA2dpInterface->接続((*)のaddr))!= BT_STATUS_SUCCESS bt_bdaddr_t){  
  16.       ALOGE("失敗したHF接続、状態:%d個"、状態)。  
  17.   }  
  18.   env-> ReleaseByteArrayElements(アドレス、ADDR、  0);  
  19.   リターン(状態== BT_STATUS_SUCCESS)?JNI_TRUE:JNI_FALSE。  

ます。https://www.cnblogs.com/wangzehuaw/p/3806774.htmlで再現

おすすめ

転載: blog.csdn.net/weixin_34043301/article/details/93778420
おすすめ