noa*_*hnu 18 java android broadcastreceiver android-intent
我正在为Android OS 4.0.3(ICS)编写一个Android应用程序.问题是我没有从BroadcastReceive的onReceive()方法获取Log.d()的输出,这意味着我的应用程序没有正确处理广播.
我已经阅读了关于如何在单击ACTION_MEDIA_BUTTON时运行代码的无数问题.当我的工作不起作用时,我甚至复制+粘贴代码,只是为了看看它是否可行.
我想要处理的ACTION_MEDIA_BUTTON是耳机上的单个按钮,允许用户接听/结束通话,播放/暂停音乐.当我点击它时,而不是我的应用程序处理此按钮,我的Nexus S Android上的股票音乐播放器开始播放一首歌曲.
我没有将我的代码放在另一个类中,也许这就是为什么它不起作用?
这是在onCreate()方法上找到的代码(这个特定的代码是在我编写的代码无效后从网站上复制的):
IntentFilter mediaButtonFilter = new IntentFilter(
Intent.ACTION_MEDIA_BUTTON);
mediaButtonFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
BroadcastReceiver brMediaButton = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
Log.d("Event", "Media button!");
this.abortBroadcast();
KeyEvent key = (KeyEvent) intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
if(key.getAction() == KeyEvent.ACTION_UP) {
int keycode = key.getKeyCode();
if(keycode == KeyEvent.KEYCODE_MEDIA_NEXT) {
Log.d("TestApp", "Next Pressed");
} else if(keycode == KeyEvent.KEYCODE_MEDIA_PREVIOUS) {
Log.d("TestApp", "Previous pressed");
} else if(keycode == KeyEvent.KEYCODE_HEADSETHOOK) {
Log.d("TestApp", "Head Set Hook pressed");
}
}
}
};
registerReceiver(brMediaButton, mediaButtonFilter);
Run Code Online (Sandbox Code Playgroud)
我真正需要测试的是KEYCODE_HEADSETHOOK,但是将其他代码用于测试并没有什么坏处,我会在一切正常工作后修复它.
在我的清单中:
<intent-filter android:priority="2147483647" >
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
Run Code Online (Sandbox Code Playgroud)
我原本以为这可能是一个权限问题,因为我没有为此指定任何权限,但我没有收到任何错误消息.
就像我之前说的那样,我尝试了很多这方面的变化.一个例子是使用此链接上的代码broadcastreceiver onReceive问题ACTION_MEDIA_BUTTON Android与CommonsWare的更正.但是,我再次修改它,因此它不是单独的类.
预先感谢您的帮助.
Rap*_*pel 13
我在搭载Android 4.4.2的三星Galaxy S5上进行了测试.那么重要的是什么,以及其他帖子中没有提到的内容:
好的,这里有一些示例代码:
mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
mReceiverComponent = new ComponentName(this,YourBroadcastReceiver.class);
...
mAudioManager.registerMediaButtonEventReceiver(mReceiverComponent);
...
// somewhere else
mAudioManager.unregisterMediaButtonEventReceiver(mReceiverComponent);
Run Code Online (Sandbox Code Playgroud)
接收器在这里:
public static class YourBroadcastReceiver extends BroadcastReceiver{
// Constructor is mandatory
public MediaBroadcastReceiver ()
{
super ();
}
@Override
public void onReceive(Context context, Intent intent) {
String intentAction = intent.getAction();
Log.i (TAG_MEDIA, intentAction.toString() + " happended");
if (!Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) {
Log.i (TAG_MEDIA, "no media button information");
return;
}
KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
if (event == null) {
Log.i (TAG_MEDIA, "no keypress");
return;
}
// other stuff you want to do
}
}
Run Code Online (Sandbox Code Playgroud)
这里是清晰的片段.如果需要,为intent-filter添加优先级,但我不需要:
<application>
<receiver android:name="OuterClass$YourBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</receiver>
<activity> ... </activity>
</application>
Run Code Online (Sandbox Code Playgroud)
参考:
| 归档时间: |
|
| 查看次数: |
21785 次 |
| 最近记录: |