我写了一些服务,使用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> ...
有没有办法让它在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));
}
现在我完全糊涂了。
答案 0 :(得分:13)
确保您的应用中有活动,并且用户在尝试按下该按钮之前运行此活动。在那之前,您的<receiver>
will not receive any broadcasts。
<强>更新强>
在Android 4.0及更高版本中,您似乎还需要拨打registerMediaButtonEventReceiver()
on 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事件。
答案 1 :(得分: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);