web-dev-qa-db-ja.com

ユーザーがヘッドセットをAndroidデバイスに接続したときを検出するには?(ACTION_AUDIO_BECOMING_NOISYの反対))

次の要件を持つアプリケーションを開発しています。デバイスにヘッドセットが接続されていて、ユーザーがそれを取り外した場合、すべてのストリームをミュートする必要があります。そのためには、_AudioManager.ACTION_AUDIO_BECOMING_NOISY_ Broadcastを聞く必要があります。これはOKです!ここでは問題ありません。

しかし、ユーザーがヘッドセットを再度接続するの場合、デバイスのミュートを解除する必要があります。しかし、反対のブロードキャスト_AudioManager.ACTION_AUDIO_BECOMING_NOISY_はありません。ヘッドセットが再び接続されたときにわかりません。

解決策の1つは、AudioManager.isWiredHeadsetOn()trueかどうかを定期的に確認することですが、これは私にとって良い解決策ではないようです。

ユーザーがデバイスにヘッドセットを接続したことを検出する方法はありますか?

編集済み:_Intent.ACTION_HEADSET_PLUG_をこの方法で使用しようとしましたしかし、動作しませんでした

Manifest.xmlに以下を置きます。

_<receiver Android:name=".MusicIntentReceiver" >
    <intent-filter>
        <action Android:name="Android.intent.action.HEADSET_PLUG" />
    </intent-filter>
</receiver>
_

そして、これが私の_MusicIntentReceiver.Java_のコードです:

_public class MusicIntentReceiver extends BroadcastReceiver {

    public void onReceive(Context ctx, Intent intent) {
        AudioManager audioManager = (AudioManager)ctx.getSystemService(Context.AUDIO_SERVICE);
        if (intent.getAction().equals(Intent.ACTION_HEADSET_PLUG)) {
            Log.d("Let's turn the sound on!");
            //other things to un-mute the streams
        }
    }
}
_

他の解決策はありますか?

28
Renato Lochetti

この呼び出しはどうですか: http://developer.Android.com/reference/Android/content/Intent.html#ACTION_HEADSET_PLUG で見つけた Droid Incredible Headphones Detection

今、あなたの質問にある更新されたコードでは不十分です。 Intent.ACTION_HEADSET_PLUGがアクティビティの開始時に受信される によると、そのブロードキャストはプラグ状態が変化したときに起こり、変化しない場合もあります。

package com.example.testmbr;

import Android.os.Bundle;
import Android.app.Activity;
import Android.content.BroadcastReceiver;
import Android.content.Context;
import Android.content.Intent;
import Android.content.IntentFilter;
import Android.util.Log;

public class MainActivity extends Activity  {
private static final String TAG = "MainActivity";
private MusicIntentReceiver myReceiver;

@Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    myReceiver = new MusicIntentReceiver();
}

@Override public void onResume() {
    IntentFilter filter = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
    registerReceiver(myReceiver, filter);
    super.onResume();
}

private class MusicIntentReceiver extends BroadcastReceiver {
    @Override public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_HEADSET_PLUG)) {
            int state = intent.getIntExtra("state", -1);
            switch (state) {
            case 0:
                Log.d(TAG, "Headset is unplugged");
                break;
            case 1:
                Log.d(TAG, "Headset is plugged");
                break;
            default:
                Log.d(TAG, "I have no idea what the headset state is");
            }
        }
    }
}

@Override public void onPause() {
    unregisterReceiver(myReceiver);
    super.onPause();
}
}

以前に推奨したAudioManager.isWiredHeadsetOn()呼び出しはAPI 14以降廃止されることが判明したため、ブロードキャストインテントから状態を抽出することに置き換えました。おそらくコネクタでのコンタクトのバウンスのために、プラグを抜くたびに複数のブロードキャストが存在する可能性があります。

85
emrys57

私はこれで作業していませんが、ドキュメントを正しく読んでいる場合、 ACTION_AUDIO_BECOMING_NOISY は、音声入力が音声出力の聞き取りを開始する可能性があることをアプリに知らせるためのものです。ヘッドセットのプラグを抜くと、電話のマイクが電話のスピーカーを拾い始め、メッセージが表示される場合があります。

一方、 - ACTION_SCO_AUDIO_STATE_UPDATED は、Bluetoothデバイスの接続状態に変更があったときに通知するように設計されています。

その2つ目はおそらくあなたが聞きたいものです。

2
Steve Blackwell