在Android上捕获媒体按钮> = 4.0(适用于2.3)

Mar*_*k R 10 android broadcastreceiver android-manifest android-4.0-ice-cream-sandwich

我写了一些服务,使用BroadcastReceiver来捕获媒体按钮之一(来自耳机的"播放按钮"),它在Android 2.3.x(HTC Nexus One或HTC Desire)上运行完美

当我试图在Android 4.0.3(三星Nexus S)上运行它不起作用(我的应用程序没有收到意图"android.intent.action.MEDIA_BUTTON"和"播放"按钮表现如常:停止/启动音乐).

清单内容:

...
<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <receiver android:name=".buttonreceiver.MediaButtonIntentReceiver" >
        <intent-filter android:priority="10000" >
            <action android:name="android.intent.action.MEDIA_BUTTON" />
        </intent-filter>
    </receiver>
...
Run Code Online (Sandbox Code Playgroud)

有没有办法让它在android 4.0.3上运行


编辑:我已尝试提出解决方案,我已添加操作并运行它,但我的接收器仍然没有收到意图.什么更奇怪的代码注册接收器也不起作用:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.about_and_activation_view);

    Log.d("MR", "onCreate - " + getIntent().getAction());

    mReceiver = new MediaButtonIntentReceiver();
    registerReceiver(mReceiver, new IntentFilter(Intent.ACTION_MEDIA_BUTTON));
}
Run Code Online (Sandbox Code Playgroud)

现在我完全糊涂了.

Com*_*are 13

确保您的应用中有活动,并且用户在尝试按下该按钮之前运行此活动.在此之前,您<receiver> 不会收到任何广播.


UPDATE

在Android 4.0及更高版本,看来你还需要调用registerMediaButtonEventReceiver()AudioManager,以便接收的事件.该状态将持续到其他呼叫registerMediaButtonEventReceiver()或直到您呼叫为止unregisterMediaButtonEventReceiver().

例如,这样的活动:

public class MediaButtonActivity extends Activity {
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ((AudioManager)getSystemService(AUDIO_SERVICE)).registerMediaButtonEventReceiver(new ComponentName(
                                                                                                       this,
                                                                                                       MediaButtonReceiver.class));
  }
}
Run Code Online (Sandbox Code Playgroud)

将启用清单注册MediaButtonReceiver以获取ACTION_MEDIA_BUTTON事件.