31

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

しかし、ユーザーがヘッドセットを再度接続すると、デバイスのミュートを解除する必要があります。しかし、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
        }
    }
}

他に試すべき解決策はありますか?

4

2 に答える 2

90

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

私があなたの質問で見た更新されたコードは今では十分ではありません。そのブロードキャストは、プラグイン状態が変化したときに発生し、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以降非推奨であることが判明したため、ブロードキャストインテントから状態を抽出するように置き換えました。おそらくコネクタの接点バウンスが原因で、プラグを差し込んだり抜いたりするたびに複数のブロードキャストが発生する可能性があります。

于 2012-11-28T17:14:12.140 に答える
2

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

一方、ACTION_SCO_AUDIO_STATE_UPDATEDBluetoothデバイスの接続状態に変化があった場合に通知するように設計されています。

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

于 2012-11-28T17:19:14.577 に答える