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

时间:2012-11-09 21:59:58

标签: android android-intent broadcastreceiver android-manifest

我在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>

这是该类的实现(加上导入)

public class AudioJackReceiver extends BroadcastReceiver {

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

}

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

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

3 个答案:

答案 0 :(得分:9)

只是补充Greg的答案,以下是您需要分为两部分的代码

  1. 在第一个活动(此处称为MainActivity.java)中注册服务。

  2. 切换ACTION_HEADSET_PLUGBroadCastReceiver操作的结果。

  3. 这就是:

    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");
                }
            }
        }
    }
    

答案 1 :(得分:2)

以下是两个可能有助于更详细解释的网站:

你必须定义你的意图;否则它将无法访问系统功能。广播接收器;将提醒您的应用程序您想要收听的更改。

每个接收器都需要进行子类化;它必须包含onReceive()。要实施onReceive(),您需要创建一个包含两个项目的方法:上下文&amp;的意图

更有可能服务是理想的;但是你将创建一个服务并通过它定义你的上下文。在上下文中;你会定义你的意图。

一个例子:

context.startService
      (new Intent(context, YourService.class));

非常基本的例子。然而;您的特定目标是利用系统范围的广播。您希望您的应用程序收到Intent.ACTION_HEADSET_PLUG的通知。

如何通过清单订阅:

<receiver
    android:name="AudioJackReceiver"
    android:enabled="true"
    android:exported="true" >
    <intent-filter>
        <action android:name="android.intent.action.HEADSET_PLUG" />
    </intent-filter>
</receiver>

或者您可以通过您的应用程序进行简单定义;但。你的特殊要求;如果您打算检测蓝牙MODIFY_AUDIO_SETTINGS,则需要用户权限。

答案 2 :(得分:1)

您需要enable the broadcast receiver并将exported属性设置为true

<receiver
    android:name="AudioJackReceiver"
    android:enabled="true"
    android:exported="true" >
    <intent-filter>
        <action android:name="android.intent.action.HEADSET_PLUG" />
    </intent-filter>
</receiver>