モバイルオーディオ出力(スピーカー)、ハンドセット(受話器)、有線ヘッドセット(WiredHeadset)、ブルートゥーススピーカー(ブルートゥースA2DP)と他の出力デバイスが入れています。通常時では、ハンズフリー電話、ヘッドセットのプラグ、オペレーティングシステムなどのBluetoothデバイスを切断するには、自動的に対応するオーディオオーディオ出力デバイスに切り替わります。このようなハンズフリー電話などのヘッドセットがヘッドセットにスピーカから切り替えて挿入し、スピーカに受話器から切り替えることです。
シーン需要
これらの戦略のAndroidシステムが自動的に切り替わり、恥ずかしリードを置くことに突然スイッチを防ぐために、音楽の動作停止(一時停止再生)を聞いたときにヘッドホンを抜くための音楽アプリケーションが必要として、当社製品のすべての需要を満たすことができません。
最近のプロジェクトは希望を必要とします即使在连接蓝牙音箱的情况下,仍旧使用手机外放播放音频
。これは、元の戦略システムを破るために、オーディオ出力チャンネルを切り替えることを余儀なくさが必要です。
情報へのアクセスは、Androidの中で見ることができAudioManager
、現在のチャンネルのオーディオ出力を切り替えて、クエリ、およびオーディオ出力は、変更キャッチし、この変更を処理したとき。
まず、以下の方法を使用しているとき、あなたが権限を追加する必要があることを思い出させます。
< 用途-許可アンドロイド:名= "android.permission.MODIFY_AUDIO_SETTINGSを" />
オーディオ出力ステータスの問い合わせ
AudioManager以下の方法が現在のステータスクエリーのオーディオ出力を提供するために使用することができます。
-
isBluetoothA2dpOn()
:Bluetoothヘッドセットを経由してA2DPAudioオーディオ出力するかどうかを確認してください。 -
isSpeakerphoneOn()
:スピーカーがオンになっていることを確認してください。 -
isWiredHeadsetOn()
:ヘッドフォン線が装着かどうかをチェックし、この方法のみイヤホン状態に挿入されているかどうかを決定するために使用されることに注意し、それはまた、他の条件に依存し、イヤホンを介して現在の音声出力を決定するために結果を使用していません。 -
setSpeakerphoneOn(boolean on)
:ダイレクト選択ラウドスピーカーの音。 -
setBluetoothScoOn(boolean on)
:SCOが通信するためにBluetoothヘッドセットを使用する必要があります。
ここで記事によると簡単にリンクBluetoothヘッドセット、A2DPおよびSCOの2種類をご紹介します。AndroidのAPIのショー:
- A2DP:高品質のオーディオリンクの一方向のデータ伝送、通常のステレオ音楽を再生するため、
- SCO:それは双方向のオーディオデータ伝送リンクで、リンクのみが8Kをサポートしており、16Kは、それだけでああ、音楽を再生するために使用することができた場合、オーディオデータは、通常の音声の伝送のためにのみ使用することができ、モノ。
2間の主な違いは次のとおりです。A2DPは再生のみ、デフォルトでオンになって、そしてSCOは、両方の録音を再生することができ、デフォルトではオフになっています。あなたが問題を記録したい場合は、確かにオープンSCOとなりますので、上記の呼び出し setBluetoothScoOn(上のブール値)は 、Bluetoothヘッドセットの録音、オーディオの再生、および完成記録を通じて、完成再生をオフにすることを忘れないでくださいことができます。
さらに、AndroidシステムによってAudioManager.setMode()
再生モード方式を管理します。setMode()
異なる再生モードは、以下の方法に対応します。
MODE_NORMAL
:ノーマルモード、リングパターンのいずれも通話モードMODE_RINGTONE
:リングパターンMODE_IN_CALL
:会話モードMODE_IN_COMMUNICATION
:モード、オーディオ/ビデオ、VoIPコール(3.0を添加して、通話モードなど)を含む通信、の。
再生モードを設定するときは、私が使用していますここに入力して流れる、流れのタイプを考慮する必要があり STREAM_MUSIC
ますが、再生デバイスに設定されて切り替える必要があるのでとき、MODE_IN_COMMUNICATION
モードの代わりの MODE_NORMAL
モード。あなたはを参照することができ、この問題。
この問題を解決します
参照して、オーディオのオーディオ出力を切り替える方法以下のアンドロイド:矛盾している間のオーディオとBluetooth電話スピーカーの切り替え:
= AudioManager AudioManager (AudioManager)context.getSystemService(Context.AUDIO_SERVICE); / ** *大声への切り替え * / パブリック 無効changeToSpeaker(){ // ここでは、代わりにMODE_IN_COMMUNICATION MODE_NORMAL Bluetoothを使用してのが切断されないことに注意してください mAudioManager.setMode (bluetoothIsConnected?AudioManager.MODE_IN_COMMUNICATION:AudioManager.MODE_NORMAL); mAudioManager.stopBluetoothSco(); (mAudioManager.setBluetoothScoOn falseには); mAudioManager.setSpeakerphoneOnが(真の); } / ** *のBluetoothスピーカーへの切り替え * / パブリック 無効changeToHeadset(){ mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION); mAudioManager.startBluetoothSco(); mAudioManager.setBluetoothScoOn(真の); mAudioManager.setSpeakerphoneOn(偽の); } / ** ******************************************************** **************************************** * / // 注:次の二つの方法まだ検証 / ** **************************** ************* * / / ** *ヘッドセットモードに切り替え * / 公共 ボイドchangeToHeadset(){ mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION); mAudioManager.stopBluetoothSco(); mAudioManager.setBluetoothScoOn(偽); mAudioManager.setSpeakerphoneOn(偽の); } / ** *切换到听筒 * / 公共 ボイドchangeToReceiver(){ audioManager.setSpeakerphoneOn(偽)。 もし(Build.VERSION.SDK_INT> = Build.VERSION_CODES.HONEYCOMB){ audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION)。 } 他{ audioManager.setMode(AudioManager.MODE_IN_CALL)。 } }
直接的な方法は、我々がすでに知っている出力チャンネルを切り替えることができます。解決すべき残りの問題は、接続、Bluetoothデバイスが切断された場合には、我々はそれが自動的にユーザーにブルートゥースが接続されていない場合、最初に設定された出力チャネルを切り替えることを望んで、それがなければならないので、ユーザによる設定は、ブルートゥースを介して放送でありますBluetoothは一度接続した後、オーディオスイッチは、Bluetoothデバイスに配置します。
ここでは、Bluetoothデバイスの接続状態を監視する方法を見て。
まず、元の使用は、次の権限が必要です注意してください。
< 用途-許可アンドロイド:名= "android.permission.BLUETOOTH_ADMIN" /> < 用途許可はアンドロイド:名= "android.permission.BLUETOOTH" />
よると、物品、我々はあなたが使用できることを発見し AudioManager.ACTION_AUDIO_BECOMING_NOISY
、ヘッドセットのラジオプラグインテントアクション、Bluetoothをオフに聞くために、これを、しかしテストはされていないので、それだけで、Bluetooth接続で放送を受信することができない、オフBluetooth無線を受信できることがわかりました我々はしたいです。
さらに、この記事を見つけた:Bluetoothの開発について、我々は放送に注意を払う必要があります以下は、Bluetooth無線をまとめたもので、。
/ ** *注釈付きラジオ、Bluetooth接続が使用される * / intentFilter.addAction(BluetoothDevice.ACTION_FOUND); // 青電圧機器を検索し、デバイスへの各検索は、ブロードキャスト送信 intentFilter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED)を、// ペアリングが成功した場合、開始をペアリングするとき intentFilter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED); // ペアリングは、接続開始 intentFilter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED)を、 intentFilter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED); // ペアエンドオフオープン接続 intentFilter.addAction(PAIRING_REQUEST); // ペアリング要求(Android.bluetooth.device.action.PAIRING_REQUEST) intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED); //検索開始 intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); // 検索が終了します。再検索すると、検索が前に終了します 。intentFilter.addAction(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE) intentFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); // マシンは、Bluetoothをオフ、スイッチをオンにする intentFilter.addAction(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED); // Bluetoothデバイスまたは切断 intentFilter.addAction(BluetoothAdapter.ACTION_LOCAL_NAME_CHANGED); // あなたは、Bluetooth名を変更し、ブルートゥースを開くには、複数回呼び出すことができ intentFilter.addAction(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); intentFilter.addAction(BluetoothAdapter.ACTION_REQUEST_ENABLE); intentFilter.addAction(BluetoothAdapter。 ACTION_SCAN_MODE_CHANGED); //検索モード変更
我々が見つかりました。BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED
そして BluetoothAdapter.ACTION_STATE_CHANGED
2回のテント放送。
したがって、これら2人の放送意図それがあるとの違いは何ですか?その一方のみが行うことができますか?ビューGoogleドキュメントが見つかりました。
-
BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED
ローカルBluetoothアダプタの接続状態の変化を指す(例えば、機械オフなしブルートゥーススイッチとして、他の対になったデバイスは、それ自体が切断しました) -
BluetoothAdapter.ACTION_STATE_CHANGED
:変更されたローカルBluetoothアダプタの状態を指します。例えば、Bluetoothのスイッチをオンまたはオフ。
言い換えれば、変更は、接続状態のため、他のBluetoothアダプタ自体の状態変化です。テストは場合にのみ、見つかった後、BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED
以下の放送に耳を傾ける「マシンをオフにするアクティブなBluetoothのスイッチ、」イベントが受信放送されます。しかし、唯一とBluetoothAdapter.ACTION_STATE_CHANGED
言葉、時間が本当にBluetoothデバイスをペアリングされていないことは明らかです。
動的登録Bluetooth接続、切断放送次のように:
- 動的登録放送
パブリック クラス BluetoothConnectionReceiver 延びBroadcastReceiver { @Override 公共 ボイドonReceive(コンテキスト・コンテキスト、インテントインテント){ IF(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED.equals(intent.getAction())){ // Bluetooth接続状態 INT状態= intent.getIntExtra(BluetoothAdapter.EXTRA_CONNECTION_STATE 、-1 ); IF(状態状態== == BluetoothAdapter.STATE_CONNECTED || BluetoothAdapter.STATE_DISCONNECTED){ // 接続または失われた連絡先、オーディオ出力(ブルートゥース、または静止強制スピーカを切り替える) } } 他の IF(BluetoothAdapter.ACTION_STATE_CHANGED.equals(intent.getAction())){ // ローカルBluetoothが開いたり閉じ INT状態= intent.getIntExtra(BluetoothAdapter.EXTRA_STATE、-1 ); IF(ステート状態== == BluetoothAdapter.STATE_OFF || BluetoothAdapter.STATE_TURNING_OFF){ // OFF、オーディオ出力を切り替えます } } } }
BluetoothConnectionReceiver audioNoisyReceiver = 新しいBluetoothConnectionReceiver(); // 蓝牙状态广播监听 IntentFilter audioFilter = 新しいIntentFilter(); audioFilter.addAction(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED)。 audioFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED)。 mContext.registerReceiver(audioNoisyReceiver、audioFilter)。
その後、我々は、Bluetoothデバイスを実現するために上記のコードに合わせてオーディオ出力チャンネルを切り替えることができ、後で私たち自身の希望のスイッチング機能を実現するための戦略を切り替え元のオペレーティングシステムの出力チャンネルを断つために強制的に接続されています。
これは切り替え:オーディオ出力のオーディオチャンネル切り替え-ブルートゥースを置きます