10

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

当我尝试在 Android 4.0.3 (Samsung 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>
...

有没有办法让它在 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));
}

现在我完全糊涂了。

4

2 回答 2

13

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


更新

registerMediaButtonEventReceiver()在 Android 4.0 及更高版本上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));
  }
}

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

于 2012-05-10T15:46:15.343 回答
2

如果您只是希望您的应用程序成为默认应用程序,但不需要对按下按钮执行任何操作,则可以使用以下方法。

将此添加到清单文件(在“应用程序”节点中):

    <receiver android:name="BroadcastReceiver">
        <intent-filter>
            <action android:name="android.intent.action.MEDIA_BUTTON" />
        </intent-filter>
</receiver>

将此添加到主活动中的 onCreate() 或应用程序运行时调用的任何位置。在 onResume() 事件中也可能有用:

    mAudioManager =  (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
    mRemoteControlResponder = new ComponentName(getActivity().getPackageName(), BroadcastReceiver.class.getCanonicalName());

    mAudioManager.registerMediaButtonEventReceiver(mRemoteControlResponder);
于 2013-11-21T00:32:03.030 回答