mam ten odbiornik do transmisji ACTION_MEDIA_BUTTON który faktycznie działa zarówno Android 2.x oraz Androida 4.1, ale z jakiegoś dziwnego powodu, na Android 2.x (tylko), otrzymuję każdego nawet dwukrotnie (dla jednym kliknięciem na przycisk pauzy, oczywiście):KeyEvent.ACTION_UP wystrzelił dwukrotnie ACTION_MEDIA_BUTTON
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:
}
}
}
}
}
próbując zrozumieć tajemnicę, loguję czas zdarzenia dla każdego takiego zdarzenia:
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)
Ponownie, to podwójne wystąpienie nie występuje w systemie Android 4.1. Dzieje się tak tylko w systemie Android 2.x.
Każdy pomysł dlaczego?
(podczas gdy mogę użyć tej samej techniki rejestrowania czasu zdarzenia, aby odfiltrować drugie wystąpienie, wolę najpierw zrozumieć, co się dzieje (możliwe błędy w programowaniu po mojej stronie?) I sprawdzić, czy istnieje lepsze rozwiązanie dla że)
Odpowiadając na poniższe pytanie: ("jak dokładnie zarejestrować swój odbiornik")
pierwszy w aplikacji manifeście:
<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>
Następnie w mojej działalności biblioteki (za this tip), w onCreate():
mRemoteControlReceiver = new ComponentName(this, RemoteControlReceiver.class);
mAudioManager.registerMediaButtonEventReceiver(mRemoteControlReceiver);
Mam nadzieję, że to daje pełniejszy obraz, który może pomóc rozwiązać tę tajemnicę.
Jak dokładnie rejestrujesz swój odbiornik? – clover
Teraz nie mogę edytować mojego tekstu nagrody (żałosnego). Przez "Nie używam żadnej biblioteki" Chodzi mi o to, że nie mam więcej niż aplikacji rejestrującej tego samego słuchacza. – matteo