web-dev-qa-db-ja.com

ヘッドセットが接続されている場合でも、Bluetoothスピーカーでオーディオを再生する方法は?

携帯電話をBluetoothスピーカーに接続し、ヘッドフォンを接続しました。次に、Bluetoothスピーカーからオーディオを再生したいと思います。オーディオストリームをAudioManager.STREAM_MUSICに設定すると、ヘッドフォンで再生されます。

ヘッドフォンでも再生するかどうかは関係ありませんが、Bluetoothスピーカーで再生する必要があります。

これはどのように可能ですか? SoundAboutアプリがそれを管理しているため、方法が必要です。

編集:ヘッドフォンを接続してからBluetoothスピーカーに接続すると、すべてのオーディオが必要なBluetoothスピーカーから再生されます。しかし、ユーザーがそれを見つけることを期待することはできず、複雑なメッセージを表示する前に、いくつかの接続時にBTスピーカーを通して常に音を再生する方法を見つけたいと思います。

ありがとう

(これはこれと同じ質問ではないことに注意してください: ヘッドセットが接続されている場合でもスピーカーからオーディオを再生する方法? 携帯電話の内蔵スピーカーではなく、Bluetoothスピーカーで再生したいです)

9
DominicM

ソリューション

メディアプレーヤーの新しいインスタンスで既にSTREAM_RINGをテストしており、ストリームタイプを直接設定しておらず、うまくいかなかったとします。Bluetoothデバイスには正しいプロファイルが必要です。

この記事 を見てください。「HALの実装」セクションを読んでください。使用できるさまざまなプロファイルのソースがたくさんあります。

また、getServiceConnected()メソッドでデバイスプロファイルをHEADSETに変更する簡単なソリューションもあります。これはStay connectedデバイスに変わりますが、出力はモノになります!私は思い出しますが、これはスピーカーにとっては残念なことですが、A2DPは一部のハードウェアではサポートされておらず、有線ヘッドセットによって中断される可能性があります。

新しいプロファイルを作成して使用することをお勧めします。HALでの作業には少し注意が必要ですが、それだけの価値はあります。

申し訳ありませんが、現時点ではソースコードを提供できません。

5
Iman

Bluetooth接続は、以下の状態がtrueの場合に機能する場合があります。 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コード例

ペアリングされたBluetoothスピーカーにプログラムで接続し、オーディオを再生します

2
Chetan Joshi

アプリケーション内にルーティングロジックがある場合、それに基づいて、どの出力を再生するかを決定できます。

私は正確な目的のために書かれたテストアプリを持っています。 マイGithubリンク

要件に基づいて、必要に応じて音声をルーティングすることもできます。 ルーティングについては、このgithubリンクを参照できます

2
Saurav

クラスMediaPlayerの新しいオブジェクトをインスタンス化し、次のメソッドを使用する必要があります

 amediaplayer.setAudioStreamType(AudioManager.STREAM_RING)

Bluetoothを使用するための承認を確認することを忘れないでください。ご存知のように、ユーザー権限なしにbluetooth経由でスピーカーに何も送信することはできません。

1
Rassam

Audiomanagerは、最新の接続デバイス(有線ヘッドセットまたはBluetoothヘッドセットのいずれか)にオーディオを上書きしてルーティングします。 Androidでは、システムアプリであり、ルーティングしたい場所にオーディオをルーティングしない限り、この設定をオーバーライドするオプションはありません。ただし、リフレクションAPIを使用して、この設定をオーバーライドできます。 Audiomanagerは、有線ヘッドセットが接続されている場合(既に接続されている場合)、Bluetooth接続ルートを中断します。コードを見ることができます ここ

したがって、リフレクションAPIを使用して、この method を呼び出すことにより、Bluetoothオーディオルートを切り替えることができます。

0
siva