2011-06-09 10 views
25

Tengo un auricular con un solo botón y quiero hacer un simple Toast cuando se presiona el botón.Registro de un botón de auricular haga clic con BroadcastReceiver en Android

En este momento tengo el siguiente código:

public class MediaButtonIntentReceiver extends BroadcastReceiver { 

public MediaButtonIntentReceiver() { 
    super(); 
} 

@Override 
public void onReceive(Context context, Intent intent) { 
    String intentAction = intent.getAction(); 
    if (!Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) { 
     return; 
    } 
    KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); 
    if (event == null) { 
     return; 
    } 
    int action = event.getAction(); 
    if (action == KeyEvent.ACTION_DOWN) { 
    // do something 
     Toast.makeText(context, "BUTTON PRESSED!", Toast.LENGTH_SHORT).show(); 
    } 
    abortBroadcast(); 
} 
} 

Y mi actividad principal es la siguiente:

public class mainActivity extends Activity { 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    IntentFilter filter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON); 
    MediaButtonIntentReceiver r = new MediaButtonIntentReceiver(); 
    registerReceiver(r, filter); 

} 
} 

No pasa nada, aunque cuando pulso el botón de embargo.

Estoy bastante seguro de que algo está mal con mis permisos/xml en el manifiesto. Aquí está el código XML receptor hasta el momento:

<receiver android:name=".MediaButtonIntentReceiver"> 
     <intent-filter> 
      <action android:name="android.intent.action.MEDIA_BUTTON" /> 
     </intent-filter> 
    </receiver> 

....

y:

<uses-permission android:name="android.permission.BLUETOOTH" /> 

noto en LogCat que cuando se presiona el botón Me aparece un error de "BluetoothIntentReceiver" diciendo "onReceive() Acción: android.intent.action.MEDIA_BUTTON"

+0

quiero cambiar la estación de radio FM en ese botón, haga clic en ¿puedo hacerlo? –

Respuesta

30

Solo quería responder mi propia pregunta en caso de que otros encuentren problemas similares.

El código funciona, simplemente no estaba viendo el Toast porque tenía instalada otra aplicación de controlador de botón de auriculares (y se ejecutaba en segundo plano), así que supongo que tenía prioridad sobre la mía. Sin embargo, cuando puse

IntentFilter filter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON);//"android.intent.action.MEDIA_BUTTON" 
    MediaButtonIntentReceiver r = new MediaButtonIntentReceiver(); 
    filter.setPriority(1000); //this line sets receiver priority 
    registerReceiver(r, filter); 

Pudo funcionar incluso con la otra aplicación instalada. Además, no necesita tanto el anterior como el XML, uno u otro está bien como formas de registrar el receptor intencionado.

+1

Muchas gracias por esta publicación. Pero para mí la configuración de la prioridad 1000 no funciona, así que la cambié a 10.000 y funciona muy bien. –

+0

Me encontré con el mismo problema, y ​​estableciendo la prioridad a 10.000 lo resolvió. Gracias. – gnclmorais

+0

No funciona en dispositivos ics – Diljeet

2

No use setPriority

registre su receptor de radiodifusión en el manifiesto

A continuación, registre su receptor de radiodifusión usando:

AudioManager # registerMediaButtonEventReceiver

El argumento es que registerMediaButtonEventReceiver un ComponentName que apunta a su receptor de difusión.

+0

¿Puedes explicarlo brevemente –

5

Esto es lo que tengo que está trabajando en Android 4.2.2

En mi manifest.xml hago esto:

<receiver android:name=".MediaButtonIntentReceiver"> 
<intent-filter> 
    <action android:name="android.intent.action.MEDIA_BUTTON" /> 
</intent-filter> 

NB: esto es en lugar de llamar a registerReceiver.

En mi actividad principal onCreate Tengo que llamar a la AudioManager:

((AudioManager)getSystemService(AUDIO_SERVICE)).registerMediaButtonEventReceiver(
    new ComponentName(
     getPackageName(), 
     MediaButtonIntentReceiever.class.getName())); 

he encontrado que funciona sin la llamada AudioManager, pero no por mucho tiempo!

+0

si es necesario unRegisterMediaButtonEventReceiver? –

Cuestiones relacionadas