2012-01-29 6 views
13

Estudié el intento ACTION_MEDIA_BUTTON y estoy tratando de usarlo e interceptar las pulsaciones del botón y presentarlas en la pantalla con un brindis. Me he registrado el receptor para interceptar dos intenciones:¿Cómo puedo interceptar el botón para presionar los auriculares en Android?

  1. ACTION_HEADSET_PLUG - conectar el auricular que

  2. ACTION_MEDIA_BUTTON - recibir las pulsaciones de botón

Esto se hace en mi actividad principal:

 IntentFilter mediaFilter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON); 
     mediaFilter.setPriority(10000); 
     registerReceiver(_receiver, new IntentFilter(Intent.ACTION_HEADSET_PLUG)); 
     registerReceiver(_receiver, mediaFilter); 

Esta es la parte de la r eceiver que maneja las pulsaciones de botón:

if (action.equals(Intent.ACTION_HEADSET_PLUG)) 
    { 
     Toast.makeText(context, "earphones activity",Toast.LENGTH_SHORT).show(); 
     if (intent.getExtras().getInt("state")==1)//if plugged 
      Toast.makeText(context, "earphones plugged",Toast.LENGTH_LONG).show(); 
     else Toast.makeText(context, "earphones un-plugged",Toast.LENGTH_LONG).show(); 
    } 
    else 
    if (action.equals(Intent.ACTION_MEDIA_BUTTON)) 
    { 
     Toast.makeText(context, "button pressed",Toast.LENGTH_LONG).show(); 
     key=intent.getExtras().getString("EXTRA_KEY_EVENT"); 
     Toast.makeText(context, key,Toast.LENGTH_LONG).show(); 
    } 

Ahora la parte que se encarga de los auriculares plug-in y la extracción funciona bien, pero la parte que intercepta el botón de prensa no lo es.

¿Hay alguna razón por la que el código que maneja el ACTION_MEDIA_BUTTON no funcione?

¿Hay algún permiso especial que necesite para interceptar tal intento?

Estoy usando un Samsung Galaxy S2 para probar el código.

He visto todas las publicaciones similares y he intentado todo. Lamentablemente, nada parece funcionar.

+0

¿con qué dispositivo está probando esto? – slayton

+0

samsung galaxy s 2 –

+0

No estoy seguro, pero podría ser que TouchWiz no implementa correctamente el intento ANDROID_MEDIA_BUTTON ... – slayton

Respuesta

3

Recientemente he desarrollado una aplicación que respondió a la tecla multimedia. Lo probé en el Samsung Galaxy S II, y funcionó.

En primer lugar, en su AndroidManifest.xml, dentro del área <application>, coloque el siguiente:

<!-- Broadcast Receivers --> 
<receiver android:name="net.work.box.controller.receivers.RemoteControlReceiver" > 
    <intent-filter android:priority="1000000000000000" > 
     <action android:name="android.intent.action.MEDIA_BUTTON" /> 
    </intent-filter> 
</receiver> 

A continuación, cree un BroadcastReceiver en un archivo diferente:

public class RemoteControlReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction()) { 
      KeyEvent event = (KeyEvent) intent .getParcelableExtra(Intent.EXTRA_KEY_EVENT); 

      if (event == null) { 
       return; 
      } 

      if (event.getAction() == KeyEvent.ACTION_DOWN) { 
       context.sendBroadcast(new Intent(Intents.ACTION_PLAYER_PAUSE)); 
      } 
     } 
    } 

} 

Esta es probablemente no la La mejor solución (especialmente la codificada con android:priority arriba). Sin embargo, intentó un par de otras técnicas y ninguna de ellas pareció funcionar. Así que tengo que recurrir a este ... Espero haber ayudado.

+2

Por favor, consulte en el siguiente enlace. Corto y fácil. http://android-developers.blogspot.com/2010/06/allowing-applications-to-play-nicer.html – Milton

+1

¡Esto funcionó para mí! – Prachi

+0

PS: 1000 debe ser el valor más alto para la prioridad, debe recibir una advertencia o error que indique que si usa android: priority = "1000000000000000". Lo correcto sería: leoneboaventura

0
if (Intent.ACTION_MEDIA_BUTTON.equals(action)) { 
    if (intent.hasExtra(Intent.EXTRA_KEY_EVENT)) { 
     String key = intent.getStringExtra(Intent.EXTRA_KEY_EVENT); 
     toast("Button "+key+" was pressed"); 
    } else 
     toast("Some button was pressed"); 
} 

Este código de retorno de la tostada "nulo ha pulsado el botón"

+0

Publique un comentario en lugar de proporcionar una respuesta, si tiene problemas. – Mercurial

2

Gracias por su contribución.

Para todos los demás luchando aquí son las conclusiones finales:

Después de un montón de lágrimas de sangre fin pude darse cuenta de que hay dos tipos de emisiones que pueda interceptar: algunos como ACTION_HEADSET_PLUG sea necesario que estén registrados en el código de actividades.

Se requiere que otros como ACTION_MEDIA_BUTTON estén registrados en el archivo de Manifiesto.

En este ejemplo para interceptar ambos intentos, necesitamos hacer ambas cosas.

Configúrelo en el código y en el archivo de manifiesto.

+0

después de varios días de lucha: ¡muchas gracias! – elgui

Cuestiones relacionadas