コールに応答する1. Bluetoothヘッドセット
これは、HFP(ハンズfreeProfile)の本来の意図の1つに対応し、Bluetooth対応のあなたの手を解放します。このシーン機能ではまず見て、電話、Bluetoothヘッドセットと携帯電話が接続され、その後、プロセスは、電話に答えるコードのBluetoothをトリガするために優先順位を与えるだろう、\ SRC \ COM \アンドロイド\電話connectBluetoothAudioの\ nCallScreen.java()電話でコードを開始/ disconnectBluetoothAudio()、接続部をよく見、以下のコメントコードに注意し、
- / *パッケージ* / ボイドconnectBluetoothAudio(){
- (VDBG)ログ(もし"connectBluetoothAudio()...");
- もし(mBluetoothHeadset!= NULL){
- // TODO(BT)チェック復帰
- mBluetoothHeadset.connectAudio();
- }
- //気をつけろ:Bluetooth接続がすぐに発生しません。
- // connectAudio()の呼び出しは即座に返されますが、その本当のを行います
- //別スレッドで動作します。mBluetoothConnectionPendingフラグ
- //画面上のUIを更新することを確実にするために、ほんの少しの策略であります
- //即座に。(上記)(isBluetoothAudioConnectedOrPendingを参照してください。)
- mBluetoothConnectionPending = はtrue。
- mBluetoothConnectionRequestTime = SystemClock.elapsedRealtime()。
- パブリック ブールconnectAudio(){
- HeadsetServiceサービスのgetService =();
- (サービスは==場合 はnull) を返す 場合はfalse
- service.connectAudioを返します();
- }
- ブールconnectAudio(){
- // TODO(BT)、BluetoothやBLUETOOTH_ADMIN許可
- enforceCallingOrSelfPermission(BLUETOOTH_PERM、 "BLUETOOTH許可が必要です");
- (もし!mStateMachine.isConnected()){
- 返す 偽;
- }
- IF(mStateMachine.isAudioOn()){
- 返す 偽;
- }
- mStateMachine.sendMessage(HeadsetStateMachine.CONNECT_AUDIO)。
- 返却 はtrue。
- }
- 静的jboolean connectAudioNative(JNIEnvの* ENV、jオブジェクトオブジェクト、jbyteArrayアドレス){
- jbyteの* addrの。
- ステータスbt_status_t;
- (!sBluetoothHfpInterface)場合は、 JNI_FALSEを返します。
- ADDR = env-> GetByteArrayElements(アドレス、NULL);
- (もし!addrの){
- jniThrowIOException(ENV、選択されました)。
- JNI_FALSEを返します。
- }
- //ここに接続
- もし((ステータス= sBluetoothHfpInterface-> connect_audio((bt_bdaddr_t *)のaddr))!=
- BT_STATUS_SUCCESS){
- ALOGE("失敗したHFオーディオ接続、状態:%d個"、状態)。
- }
- env-> ReleaseByteArrayElements(アドレス、ADDR、 0);
- リターン(状態== BT_STATUS_SUCCESS)?JNI_TRUE:JNI_FALSE。
- }
- 静的bt_status_t connect_audio(bt_bdaddr_t * BD_ADDR)
- {
- CHECK_BTHF_INIT();
- もし(is_connected(BD_ADDR))
- {
- BTA_AgAudioOpen(btif_hf_cb.handle)。
- / * *オーディオの接続が正常に開始されたアプリケーションを通知/
- btif_transfer_context(btif_in_hf_generic_evt、BTIF_HFP_CB_AUDIO_CONNECTING、
- (CHAR *)BD_ADDR、はsizeof(bt_bdaddr_t)、NULL);
- BT_STATUS_SUCCESSを返します。
- }
- BT_STATUS_FAILを返します。
- }
ブルートゥースリスト2.接続のBluetoothヘッドセット
A2DP接続処理、それはデバイスのリストから開始されるので、これはコードの自然な開始であるため、検索結果のブルートゥース・リストにBluetoothヘッドセットを接続します
- DevicePickerFragment.java(設定\ SRC \ comのアンドロイド\設定\ \ブルートゥース) 3884 2013- 6 - 26
- ボイドonClicked(){
- INT bondState = mCachedDevice.getBondState()。
- IF(mCachedDevice.isConnected()){
- askDisconnect();
- } そう であれば(bondState == BluetoothDevice.BOND_BONDED){
- mCachedDevice.connect(真の);
- } .......
- }
- ボイド接続(ブールconnectAllProfiles){
- IF(!ensurePaired()){ //最初に必ずペアリングすることを作ります
- 返します。
- }
- mConnectAttempted = SystemClock.elapsedRealtime()。
- connectWithoutResettingTimer(connectAllProfiles); 他に//何もない、ここでしか見ること
- }
- //彼らがいなかった場合はプロファイルを初期化するために試してみてください。
- ...........
- //唯一のショー-1-エラーダイアログ追跡変数をリセット
- mIsConnectingErrorPossible = はtrue。
- int型preferredProfiles = 0;
- {(mProfiles LocalBluetoothProfileプロファイル)のために
- もし(?connectAllProfiles profile.isConnectable():profile.isAutoConnectable()){
- IF(profile.isPreferred(mDevice)){
- ++ preferredProfiles;
- connectInt(プロフィール); //この接続を、
- }
- }
- }
- .............
- パブリック ブール{(BluetoothDevice装置)を接続
- (mServiceは==場合 はnull) を返す 場合はfalse
- 一覧<BluetoothDevice>シンク=のgetConnectedDevices();
- もし(シンク!= NULL){
- {(シンクをBluetoothDeviceシンク)のために
- mService.disconnect(シンク)。
- }}
- mService.connect(デバイス)を返します。
- }
- パブリック ブール{(BluetoothDevice装置)を接続
- (mService!=の場合 はnull && ISENABLED()&&
- isValidDevice(デバイス)){
- {試します
- mService.connect(デバイス)を返します。
- } キャッチ(RemoteExceptionを電子){
- Log.e(TAG、 "スタック:" + Log.getStackTraceString(新しいThrowableを()));
- 返す 偽;
- }
- } ...........
- 返す 偽;
- バインダージャンプ
- パブリック ブール{(BluetoothDevice装置)を接続
- A2dpServiceサービスのgetService =();
- (サービスは==場合 はnull) を返す 場合はfalse
- service.connect(デバイス)を返します。
- }
- }
- 静的jboolean connectA2dpNative(JNIEnvの* ENV、jオブジェクトオブジェクト、jbyteArrayアドレス){
- jbyteの* addrの。
- bt_bdaddr_t * btAddr。
- ステータスbt_status_t;
- ALOGI("%sの:sBluetoothA2dpInterface:%のP"、__FUNCTION__、sBluetoothA2dpInterface)。
- (!sBluetoothA2dpInterface)場合は、 JNI_FALSEを返します。
- ADDR = env-> GetByteArrayElements(アドレス、NULL);
- btAddr =(bt_bdaddr_t *)のaddr;
- (もし!addrの){
- jniThrowIOException(ENV、選択されました)。
- JNI_FALSEを返します。
- }
- もし((ステータス= sBluetoothA2dpInterface->接続((*)のaddr))!= BT_STATUS_SUCCESS bt_bdaddr_t){
- ALOGE("失敗したHF接続、状態:%d個"、状態)。
- }
- env-> ReleaseByteArrayElements(アドレス、ADDR、 0);
- リターン(状態== BT_STATUS_SUCCESS)?JNI_TRUE:JNI_FALSE。
ます。https://www.cnblogs.com/wangzehuaw/p/3806774.htmlで再現