MediaButtonIntentReceiver no funciona en Android 4.0+
El objetivo es interceptar emisiones de los auriculares, así como bluetooth eventualmente, para responder a diferentes tipos de clics desde el auricular para alterar el reproductor multimedia. Esta solución funciona correctamente para todas las versiones anteriores a ICS. He aquí algunos de los códigos y cosas que he probado:
.... 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(); } }
Para tratar de hacer que esto funcione, suena como 4.0 + requiere algo como esto que no funcionó:
- Enrutado del reproductor multimedia de Android
- OnCompletion escucha con MediaPlayer
- URL del stream de Media Player y, a continuación, reproducir url siguiente
- Reproductor de medios de Android: descargue a archivo y secuencia de archivo
- Subtítulos / Soporte de subtítulos en Android
((AudioManager)getSystemService(AUDIO_SERVICE)).registerMediaButtonEventReceiver(new ComponentName(this, MediaButtonIntentReceiver.class));
Incluso traté de añadirlo al manifiesto, además de lo anterior:
<receiver android:name=".MediaButtonIntentReceiver" android:enabled="true"> <intent-filter android:priority="2147483647" > <action android:name="android.intent.action.MEDIA_BUTTON" /> </intent-filter> </receiver>
Todavía no hay suerte. ¿Que me estoy perdiendo aqui? Es ciertamente un 4.0 + / ICS / JellyBean cuestión … Esto se está haciendo en un servicio, no una actividad.
- Flujo de problemas de audio en ICS
- ¿Cuál es la mejor manera de obtener una duración de archivo de audio en Android?
- Comunicación entre servicio y actividad en una aplicación android mediaplayer
- Transmisión con Android MediaPlayer en SDK 8
- ¿Cómo puedo enviar un archivo pregrabado (wav) durante una llamada de voz?
- ¿Es posible en Android registrar algo reproducido por MediaPlayer?
- Grabar audio con MediaRecorder y reproducir simultaniosamente con MediaPlayer
- Cómo utilizar el archivo webvtt con MediaPlayer para pista de audio en Android
Parece que su receptor de difusión es una clase interna para su servicio? Si es así, haga que su receptor de difusión esté estático y en el manifiesto haga lo siguiente:
<receiver android:name="MyOuterClass$MediaButtonIntentReceiver" android:enabled="true"> <intent-filter android:priority="2147483647" > <action android:name="android.intent.action.MEDIA_BUTTON" /> </intent-filter> </receiver>
En Android 3.0 + debe utilizar registerMediaButtonEventReceiver
para registrar el receptor. Esto utiliza el AndroidManifest para el IntentFilter. La razón por la que funciona en 2.x es porque lo está registrando con this.registerReceiver()
que registró el receptor sin el AndroidManifest.
Sólo probar jalea en esto está funcionando para mí:
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"); } };
Intención:
IntentFilter intentfilterTime = null; intentfilterTime = new IntentFilter(); intentfilterTime.addAction("android.intent.action.MEDIA_BUTTON"); registerReceiver(broadcastReceiver, intentfilterTime);
Prueba de servicio con el botón de medios de Widgetsoid (que emulan los botones de medios BT). Todo está funcionando.
- Implementación de un diseño personalizable en Android
- Cómo iniciar aplicaciones Android en mi aplicación en Android?