在Android中如何注册接收耳机插头广播?

shi*_*him 3 android broadcastreceiver android-manifest android-intent

我在Android 2.1中工作,我想检测耳机插入/取出的时间.我对android很新.

我认为这样做的方法是使用广播接收器.我放弃了这个,我还在AndroidManifest.xml中添加了以下内容.但你是否必须在其他方面注册接收器,就像在活动中一样?我知道这有很多线索,但我真的不明白他们在谈论什么.另外,在AndroidManifest.xml中注册与在活动中动态注册之间的区别是什么?

<receiver android:enabled="true" android:name="AudioJackReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.HEADSET_PLUG" >
            </action>
        </intent-filter>
    </receiver>
Run Code Online (Sandbox Code Playgroud)

这是该类的实现(加上进口)

public class AudioJackReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    Log.w("DEBUG", "headset state received");
}
Run Code Online (Sandbox Code Playgroud)

}

我只是想看看它是否有效,但是当我在运行应用程序时拔下/插入耳机时没有任何显示.

编辑:文档没有说明这一点,但如果在清单中注册,这个可能无法正常工作吗?当我在我的一个应用程序中注册接收器时,我能够让它响应(或者你还必须这样做吗?)

Ren*_*tti 10

只是补充Greg的答案,这里需要的代码分为两部分

  1. 在第一个Activity(这里称为MainActivity.java)中注册服务.

  2. 切换ACTION_HEADSET_PLUG动作的结果BroadCastReceiver.

在这里:

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");
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我已经尝试将接收器和过滤器放入清单中,同时android:enabled ="true"和android:exported ="true",但我的hanlder没有被调用.通过Renato建议的代码注册,它就像一个魅力! (2认同)