4

我在 Android 2.1 中工作,我想检测耳机何时插入/取出。我对安卓很陌生。

我认为这样做的方法是使用广播接收器。我对此进行了细分,并将以下内容放入我的 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");
}

}

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

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

4

3 回答 3

11

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

  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");
            }
        }
    }
}
于 2013-08-01T15:20:59.377 回答
2

这里有两个网站可能有助于更详细地解释它:

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

每个接收器都需要子类化;它必须包括一个onReceive(). 要实现它,onReceive()您需要创建一个包含两个项目的方法:ContextIntent

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

一个例子:

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

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

如何通过 manifest 订阅:

<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

于 2012-11-12T19:42:35.870 回答
-1

您需要启用广播接收器并将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>
于 2012-11-11T00:34:07.503 回答