携帯電話をBluetoothスピーカーに接続し、ヘッドフォンを接続しました。次に、Bluetoothスピーカーからオーディオを再生したいと思います。オーディオストリームをAudioManager.STREAM_MUSIC
に設定すると、ヘッドフォンで再生されます。
ヘッドフォンでも再生するかどうかは関係ありませんが、Bluetoothスピーカーで再生する必要があります。
これはどのように可能ですか? SoundAboutアプリがそれを管理しているため、方法が必要です。
編集:ヘッドフォンを接続してからBluetoothスピーカーに接続すると、すべてのオーディオが必要なBluetoothスピーカーから再生されます。しかし、ユーザーがそれを見つけることを期待することはできず、複雑なメッセージを表示する前に、いくつかの接続時にBTスピーカーを通して常に音を再生する方法を見つけたいと思います。
ありがとう
(これはこれと同じ質問ではないことに注意してください: ヘッドセットが接続されている場合でもスピーカーからオーディオを再生する方法? 携帯電話の内蔵スピーカーではなく、Bluetoothスピーカーで再生したいです)
ソリューション
メディアプレーヤーの新しいインスタンスで既にSTREAM_RINGをテストしており、ストリームタイプを直接設定しておらず、うまくいかなかったとします。Bluetoothデバイスには正しいプロファイルが必要です。
この記事 を見てください。「HALの実装」セクションを読んでください。使用できるさまざまなプロファイルのソースがたくさんあります。
また、getServiceConnected()メソッドでデバイスプロファイルをHEADSETに変更する簡単なソリューションもあります。これはStay connectedデバイスに変わりますが、出力はモノになります!私は思い出しますが、これはスピーカーにとっては残念なことですが、A2DPは一部のハードウェアではサポートされておらず、有線ヘッドセットによって中断される可能性があります。
新しいプロファイルを作成して使用することをお勧めします。HALでの作業には少し注意が必要ですが、それだけの価値はあります。
申し訳ありませんが、現時点ではソースコードを提供できません。
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();
}
}
以下のリンクをご覧ください。サンプルコードを使用すると役立つ場合があります。
アプリケーション内にルーティングロジックがある場合、それに基づいて、どの出力を再生するかを決定できます。
私は正確な目的のために書かれたテストアプリを持っています。 マイGithubリンク
要件に基づいて、必要に応じて音声をルーティングすることもできます。 ルーティングについては、このgithubリンクを参照できます
クラスMediaPlayerの新しいオブジェクトをインスタンス化し、次のメソッドを使用する必要があります
amediaplayer.setAudioStreamType(AudioManager.STREAM_RING)
Bluetoothを使用するための承認を確認することを忘れないでください。ご存知のように、ユーザー権限なしにbluetooth経由でスピーカーに何も送信することはできません。
Audiomanagerは、最新の接続デバイス(有線ヘッドセットまたはBluetoothヘッドセットのいずれか)にオーディオを上書きしてルーティングします。 Androidでは、システムアプリであり、ルーティングしたい場所にオーディオをルーティングしない限り、この設定をオーバーライドするオプションはありません。ただし、リフレクションAPIを使用して、この設定をオーバーライドできます。 Audiomanagerは、有線ヘッドセットが接続されている場合(既に接続されている場合)、Bluetooth接続ルートを中断します。コードを見ることができます ここ 。
したがって、リフレクションAPIを使用して、この method を呼び出すことにより、Bluetoothオーディオルートを切り替えることができます。