2017-03-01 240 views
9

我有我的手機連接到藍牙揚聲器和插上耳機。現在,我想通過藍牙揚聲器播放音頻。 當我將音頻流設置爲AudioManager.STREAM_MUSIC時,它只是通過耳機播放。即使耳機插入,如何通過藍牙揚聲器播放音頻?

如果它播放的耳機也不要緊,但我需要它的藍牙揚聲器播放。

這怎麼可能?該應用程序SoundAbout設法做到這一點,所以必須有一種方法。

編輯:當我插入耳機,只有後來連接藍牙揚聲器,所有音頻播放通過藍牙揚聲器,我想要的。但我不能指望用戶發現,並有向他們展示一個複雜的消息,我寧願找到出路,使聲音在連接到一些通過BT音箱總是打之前。

感謝

(請注意,這是不一樣的問題,因爲這:How to Play audio through speaker even when headset is plugged in? 我希望它在藍牙揚聲器播放,而不是手機的集成揚聲器)

+0

我不認爲這是可能的,因爲android一次只能輸出一種輸出方式。如果萬一你發現有什麼東西讓我起來......! –

+0

我只需要藍牙揚聲器,這將是一種方法。但有時它實際上可以兩種方式工作,例如當你設置音頻流AudioManager.STREAM_RING,並有一個藍牙揚聲器連接音頻播放通過手機的揚聲器和通過藍牙揚聲器(但是,當你插入一個耳機,它不再播放藍牙揚聲器,我需要) – DominicM

+0

一個非常基本的問題:爲什麼不能使用audiomanager apis通過bt揚聲器路由音頻?它不工作?我認爲使用startBluetoothSco()通過bt強制音頻很簡單。我沒有嘗試過,但檢查是否有使用此問題。 – manishg

回答

6

解決方案

假設你已經在你的新的媒體播放器的實例測試STREAM_RING,而不是直接設置流類型,它沒有工作,你需要爲你的藍牙設備正確的個人資料。

看看this article 閱讀「實施HAL」部分,有許多不同配置文件的源代碼可供您使用。

也有一個簡單的解決辦法是改變你的設備配置文件在你的getServiceConnected到耳機()方法時,它會變成一個保持連接的設備,但輸出將變爲單聲道!據我所知,對於揚聲器來說這是一種恥辱,A2DP在某些硬件中也可能不被支持,並且仍然被有線耳機中斷。

我建議創建一個新的配置文件,並使用它,用HAL有點棘手的工作,但會值得的,

對不起,我不能給你的那一刻提供源代碼。

+0

請您創建一個示例源代碼? – Imzich

+0

@Imzich我幾年沒有爲android編寫任何代碼,但我會盡快提供一個樣本。 – Zich

+0

使用STREAM_RING時,聲音會通過藍牙揚聲器播放,但也可以通過手機的內置揚聲器播放,這並不是我想要的。我沒有寫任何藍牙代碼,因爲我希望用戶能夠通過操作系統連接到BT。當我沒有插入耳機時,音頻通過BT播放,所以藍牙輸出工作,這不是問題。還是我誤解了一些東西? – DominicM

1

您需要實例類的MediaPlayer的一個新對象,並使用下面的方法就可以了

amediaplayer.setAudioStreamType(AudioManager.STREAM_RING) 

不要忘記檢查授權使用藍牙,您將無法通過藍牙發送任何揚聲器,無需用戶你知道的特權。

+1

隨着STREAM_RING音頻播放在藍牙揚聲器和手機的內部揚聲器。藍牙輸出可以和STREAM_MUSIC一起工作,所以這不是問題,但插入耳機後,它會通過耳機而不是藍牙揚聲器播放。 – DominicM

2

藍牙連接可以與下面的狀態是真實的工作。 收到BluetoothA2dp.STATE_CONNECTED後,您可以正常播放音樂。

android.bluetooth.BluetoothA2dp.STATE_CONNECTED

public BluetoothHandsfree(Context context, CallManager cm) { 
    mCM = cm; 
    mContext = context; 
    BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); 
    boolean bluetoothCapable = (adapter != null); 
    mHeadset = null; // nothing connected yet 
    mA2dp = new BluetoothA2dp(mContext); 
    mA2dpState = BluetoothA2dp.STATE_DISCONNECTED; 
    mA2dpDevice = null; 
    mA2dpSuspended = false; 

    mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
    mStartCallWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, 
                TAG + ":StartCall"); 
    mStartCallWakeLock.setReferenceCounted(false); 
    mStartVoiceRecognitionWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, 
                TAG + ":VoiceRecognition"); 
    mStartVoiceRecognitionWakeLock.setReferenceCounted(false); 

    mLocalBrsf = BRSF_AG_THREE_WAY_CALLING | 
       BRSF_AG_EC_NR | 
       BRSF_AG_REJECT_CALL | 
       BRSF_AG_ENHANCED_CALL_STATUS; 

    if (sVoiceCommandIntent == null) { 
     sVoiceCommandIntent = new Intent(Intent.ACTION_VOICE_COMMAND); 
     sVoiceCommandIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    } 
    if (mContext.getPackageManager().resolveActivity(sVoiceCommandIntent, 0) != null && 
      BluetoothHeadset.isBluetoothVoiceDialingEnabled(mContext)) { 
     mLocalBrsf |= BRSF_AG_VOICE_RECOG; 
    } 

    mBluetoothPhoneState = new BluetoothPhoneState(); 
    mUserWantsAudio = true; 
    mPhonebook = new BluetoothAtPhonebook(mContext, this); 
    mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 
    cdmaSetSecondCallState(false); 

    if (bluetoothCapable) { 
     resetAtState(); 
    } 

} 

Java代碼示例,請看看下面的鏈接:與示例代碼,它可以幫助你。

Java Code Examples for android.bluetooth.BluetoothHeadset

Programmatically connect to paired Bluetooth speaker and play audio

0

Audiomanager替代和音頻路由到最新連接的設備(無論是有線耳機或藍牙耳機)。在android中,我們沒有任何選項可以覆蓋此設置,除非它是系統應用程序並將音頻路由到我們希望路由的任何位置。但是,您可以使用反射apis並覆蓋此設置。如果有線耳機已連接,Audiomanager會暫停藍牙連接路由(如果已連接),反之亦然。您可以查看代碼here

因此,使用反射apis,您可以通過調用此method來切換藍牙音頻路由。

相關問題