an0*_*00b 20 android broadcastreceiver android-audiomanager
我有这个ACTION_MEDIA_BUTTON的广播接收器,它实际上适用于Android 2.x和Android 4.1,但由于一些奇怪的原因,在Android 2.x(仅限)上,我得到每个甚至两次(只需单击暂停按钮,当然):
public class RemoteControlReceiver extends BroadcastReceiver {
private static long prevEventTime = 0;
@Override
public void onReceive(Context ctx, Intent intent) {
if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) {
KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
long curEventTime = event.getEventTime();
if (event != null && (event.getAction() == KeyEvent.ACTION_UP) /*&& (curEventTime != prevEventTime)*/) {
int keycode = event.getKeyCode();
switch (keycode)
{
case KeyEvent.KEYCODE_MEDIA_NEXT:
Log.i(TAG, "KEYCODE_MEDIA_NEXT");
break;
case KeyEvent.KEYCODE_HEADSETHOOK:
Log.i(TAG, "KEYCODE_HEADSETHOOK" + " " + curEventTime + " <> " + prevEventTime + " (" + event.getAction() + ")");
prevEventTime = curEventTime;
break;
case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
Log.i(TAG, "KEYCODE_MEDIA_PREVIOUS");
break;
default:
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
试图理解这个谜团,我记录每次这样的事件的事件时间:
03-01 18:27:05.264: I/RemoteControlReceiver.onReceive(22377): KEYCODE_HEADSETHOOK 142304436 <> 0 (1)
03-01 18:27:05.434: I/RemoteControlReceiver.onReceive(22377): KEYCODE_HEADSETHOOK 142304436 <> 142304436 (1)
03-01 18:27:14.054: I/RemoteControlReceiver.onReceive(22377): KEYCODE_HEADSETHOOK 142313265 <> 142304436 (1)
03-01 18:27:14.074: I/RemoteControlReceiver.onReceive(22377): KEYCODE_HEADSETHOOK 142313265 <> 142313265 (1)
03-01 18:27:24.254: I/RemoteControlReceiver.onReceive(22377): KEYCODE_HEADSETHOOK 142323464 <> 142313265 (1)
03-01 18:27:24.264: I/RemoteControlReceiver.onReceive(22377): KEYCODE_HEADSETHOOK 142323464 <> 142323464 (1)
03-01 18:27:37.574: I/RemoteControlReceiver.onReceive(22377): KEYCODE_HEADSETHOOK 142336795 <> 142323464 (1)
03-01 18:27:37.614: I/RemoteControlReceiver.onReceive(22377): KEYCODE_HEADSETHOOK 142336795 <> 142336795 (1)
03-01 18:27:45.214: I/RemoteControlReceiver.onReceive(22377): KEYCODE_HEADSETHOOK 142344433 <> 142336795 (1)
03-01 18:27:45.284: I/RemoteControlReceiver.onReceive(22377): KEYCODE_HEADSETHOOK 142344433 <> 142344433 (1)
03-01 18:27:52.474: I/RemoteControlReceiver.onReceive(22377): KEYCODE_HEADSETHOOK 142351687 <> 142344433 (1)
03-01 18:27:52.504: I/RemoteControlReceiver.onReceive(22377): KEYCODE_HEADSETHOOK 142351687 <> 142351687 (1)
Run Code Online (Sandbox Code Playgroud)
同样,Android 4.1中不会发生这种双重现象.它只发生在Android 2.x中.
知道为什么吗?
(虽然我可以使用相同的事件时间记录技术来过滤掉第二次出现,但我更喜欢先了解发生了什么(我可能的编程错误?)并查看是否有更好的解决方案)
回答以下问题:( "你如何准确注册接收器")
首先在应用程序的清单中:
<receiver android:name="com.example.mylib.RemoteControlReceiver" android:enabled="true">
<intent-filter android:priority="2147483647" >
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
然后,在我的库的活动中(按照此提示),在OnCreate()中:
mRemoteControlReceiver = new ComponentName(this, RemoteControlReceiver.class);
mAudioManager.registerMediaButtonEventReceiver(mRemoteControlReceiver);
Run Code Online (Sandbox Code Playgroud)
我希望这提供了一个更完整的图片,可以帮助解决这个谜.
我注意到你在库中使用这个接收器(清单中的"mylib"部分).
如果情况确实如此,并且您有两个共享相同注册码的应用程序注册的接收器,您将看到这些事件两次.
如果三个应用程序注册该接收器,您将收到这些事件三倍...
确保每个应用程序使用不同的(唯一的)<receiver android:name.
我遇到了这个问题并花了一些时间撞到墙上,然后才意识到按下按钮会产生两个事件:KeyEvent.ACTION_DOWN和KeyEvent.ACTION_UP.因此,使用媒体按钮需要两个测试:
if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) {}
Run Code Online (Sandbox Code Playgroud)
和
if (event.getAction() == KeyEvent.ACTION_DOWN) {}
Run Code Online (Sandbox Code Playgroud)
因此,如果其他人因同样的错误而发现自己在这里,也许这个回复会有所帮助.
| 归档时间: |
|
| 查看次数: |
4422 次 |
| 最近记录: |