簡體   English   中英

即使插入耳機,如何通過藍牙揚聲器播放音頻?

[英]How to play audio through Bluetooth speaker even when headset is plugged in?

我將手機連接到藍牙揚聲器並插入了耳機。現在我想通過藍牙揚聲器播放音頻。 當我將音頻流設置為AudioManager.STREAM_MUSIC它只是通過耳機播放。

它是否在耳機上播放並不重要,但我需要它在藍牙揚聲器上播放。

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

編輯:當我插入耳機后,只有連接到藍牙揚聲器后,所有音頻都通過我想要的藍牙揚聲器播放。 但是我不能指望用戶找到它並且在向他們展示一個復雜的消息之前我寧願找到一種方法來使聲音在連接到某些時始終通過BT揚聲器播放。

謝謝

(請注意,這與以下問題不同: 即使插入耳機,如何通過揚聲器播放音頻?我希望它能夠在藍牙揚聲器上播放,而不是在手機的集成揚聲器上播放。)

假設您已經在新的媒體播放器實例上測試了STREAM_RING而沒有直接設置流類型,並且它沒有用完,您需要一個正確的藍牙設備配置文件。

看看這篇文章閱讀“實施HAL”部分,您可以使用不同的配置文件的很多來源。

還有一個簡單的解決方案是將您的設備配置文件更改為getServiceConnected()方法中的HEADSET,它將變為保持連接設備,但輸出將變為單聲道! 我記得,對於揚聲器來說這是一個恥辱,A2DP也可能在某些硬件中不受支持,但仍然被有線耳機打斷。

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

很抱歉,我暫時無法為您提供源代碼。

藍牙連接可能與以下狀態一致。 收到BluetoothA2dp.STATE_CONNECTED ,您可以正常播放音樂。

android.bluetooth.BluetoothA2dp.STATE_CONNECTED Java代碼示例

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();
    }

}

請查看以下鏈接:使用示例代碼可以幫助您。

android.bluetooth.BluetoothHeadset的Java代碼示例

以編程方式連接到配對的藍牙揚聲器並播放音頻

如果您的應用程序中有路由邏輯,那么您可以根據該邏輯決定要播放音頻的輸出。

我有一個針對確切目的編寫的測試應用程序。 我的Github鏈接

您還可以根據需要根據需要路由音頻。 您可以參考此github鏈接進行路由

您需要實例化MediaPlayer類的新對象,並在其上使用以下方法

 amediaplayer.setAudioStreamType(AudioManager.STREAM_RING)

不要忘記檢查使用藍牙的授權,如果沒有用戶權限,您無法通過藍牙向揚聲器發送任何內容。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM