31

我正在开发一个具有以下必要条件的应用程序:如果设备中插入了耳机并且用户将其移除,我需要将所有流静音。为此,我需要收听AudioManager.ACTION_AUDIO_BECOMING_NOISY广播。还行吧!这里没有问题。

但是当用户再次插入耳机时,我需要取消静音设备。但是没有AudioManager.ACTION_AUDIO_BECOMING_NOISY相反的广播。我不知道何时重新插入耳机。

一种解决方案是定期查看是否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

这个电话怎么样:http: //developer.android.com/reference/android/content/Intent.html#ACTION_HEADSET_PLUG 我在 Droid Incredible Headphones Detection找到的 ?

我现在在您的问题中看到的更新代码还不够。根据Intent.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_UPDATED旨在让您知道蓝牙设备的连接状态何时发生变化。

第二个可能是你想听的。

于 2012-11-28T17:19:14.577 回答