MediaButtonIntentReceiver не работает в Android 4.0+
Цель состоит в том, чтобы перехватывать трансляции с гарнитуры, а также, в конце концов, через Bluetooth, чтобы реагировать на различные типы нажатий с гарнитуры, чтобы изменить медиаплеер. Это решение отлично работает для всех версий до ICS. Вот часть кода и вещей, которые я пробовал:
....
private BroadcastReceiver mediaButtonReceiver = new MediaButtonIntentReceiver();
....
public void onCreate() {
...
IntentFilter mediaFilter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON);
mediaFilter.setPriority(2147483647); // this is bad...I know
this.registerReceiver(mediaButtonReceiver, mediaFilter);
...
}
public class MediaButtonIntentReceiver extends BroadcastReceiver {
private KeyEvent event;
public MediaButtonIntentReceiver() {
super();
}
@Override
public void onReceive(Context context, Intent intent) {
String intentAction = intent.getAction();
if (!Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) {
return;
}
event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
if (event == null) {
return;
}
try {
int action = event.getAction();
switch(action) {
case KeyEvent.ACTION_UP :
Log.d("TEST", "BUTTON UP");
break;
case KeyEvent.ACTION_DOWN :
case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE :
Log.d("TEST", "BUTTON DOWN");
break;
}
} catch (Exception e) {
Log.d("TEST", "THIS IS NOT GOOD");
}
abortBroadcast();
}
}
Чтобы попытаться заставить это работать, кажется, что 4.0+ требует чего-то вроде этого, который не работал:
((AudioManager)getSystemService(AUDIO_SERVICE)).registerMediaButtonEventReceiver(new ComponentName(this, MediaButtonIntentReceiver.class));
Я даже пытался добавить его в манифест, в дополнение к вышесказанному:
<receiver android:name=".MediaButtonIntentReceiver" android:enabled="true">
<intent-filter android:priority="2147483647" >
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</receiver>
Все еще не повезло. Что мне здесь не хватает? Это, безусловно, проблема 4.0+/ICS/JellyBean... Это делается в службе, а не в деятельности.
2 ответа
Похоже, ваш приемник вещания является внутренним классом для вашего сервиса? Если так, сделайте ваш приемник вещания статическим и в манифесте сделайте это:
<receiver android:name="MyOuterClass$MediaButtonIntentReceiver" android:enabled="true">
<intent-filter android:priority="2147483647" >
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</receiver>
В Android 3.0+ вы должны использовать registerMediaButtonEventReceiver
зарегистрировать получателя. Это использует AndroidManifest для IntentFilter. Причина, по которой он работает в 2.x, в том, что вы регистрировали его в this.registerReceiver()
который зарегистрировал получатель без AndroidManifest.
Просто примерьте желе, это работает для меня:
broadcastReceiver = new BroadcastReceiver() {//global BroadcastReceiver
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if(action.equals("android.intent.action.MEDIA_BUTTON")){
Log.e("test", "ok");
}
};
Намерение:
IntentFilter intentfilterTime = null;
intentfilterTime = new IntentFilter();
intentfilterTime.addAction("android.intent.action.MEDIA_BUTTON");
registerReceiver(broadcastReceiver, intentfilterTime);
Тест с сервиса с медиа-кнопкой Widgetsoid (которая эмулирует BT медиа-кнопки). Все работает.