2012-05-10 7 views
7

Escribí algún servicio que usa BroadcastReceiver para capturar uno de los botones de medios ("play button" de un auricular), y funciona perfectamente en android 2.3.x (HTC Nexus One o HTC Desire)Botón de captura de medios en Android> = 4.0 (funciona en 2.3)

Cuando traté de ejecutar en Android 4.0.3 (Samsung Nexus S), no funciona (mi aplicación no recibe la intención "android.intent.action.MEDIA_BUTTON" y " play "se comporta como de costumbre: detiene/inicia la música).

contenido del manifiesto:

... 
<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <receiver android:name=".buttonreceiver.MediaButtonIntentReceiver" > 
     <intent-filter android:priority="10000" > 
      <action android:name="android.intent.action.MEDIA_BUTTON" /> 
     </intent-filter> 
    </receiver> 
... 

¿Hay manera de hacer que funcione en Android 4.0.3


editar: He tratar solución propuesta, he añadido la acción y la ejecución pero mi receptor todavía no recibe la intención. Lo que es más extraño registrar receptor por código tampoco funciona:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.about_and_activation_view); 

    Log.d("MR", "onCreate - " + getIntent().getAction()); 

    mReceiver = new MediaButtonIntentReceiver(); 
    registerReceiver(mReceiver, new IntentFilter(Intent.ACTION_MEDIA_BUTTON)); 
} 

Ahora estoy totalmente confundido.

+0

Nótese también que Intención prioridad debe ser mayor de -1,000 y menos de 1000. – William

Respuesta

12

Asegúrese de tener una actividad en su aplicación y de que el usuario ejecute esta actividad antes de intentar presionar ese botón. Hasta entonces, su <receiver>will not receive any broadcasts.


ACTUALIZACIÓN

En Android 4.0 y superior, parece que también hay que llamar registerMediaButtonEventReceiver() on AudioManager con el fin de recibir los eventos. Ese estado se mantendrá hasta que otra persona llame al registerMediaButtonEventReceiver() o hasta que llame al unregisterMediaButtonEventReceiver().

Por ejemplo, una actividad como esta:

public class MediaButtonActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    ((AudioManager)getSystemService(AUDIO_SERVICE)).registerMediaButtonEventReceiver(new ComponentName(
                             this, 
                             MediaButtonReceiver.class)); 
    } 
} 

permitirá una manifiesta registrada MediaButtonReceiver obtener los eventos ACTION_MEDIA_BUTTON.

+0

Tengo sólo el servicio que se ejecuta el reconocimiento de voz y envía algunos otros intets . Esto funciona muy bien en Android 2.3.x. ¿Es esta la única solución posible? La actividad en ejecución requiere una pantalla activa para recibir intenciones y esto no es aceptable para mí. –

+0

@MarekR: "¿Es esta la única solución posible?" - Sí, aunque sospecho que no entendiste la solución. No tienen que dejar la actividad en marcha. Simplemente tienen que iniciar manualmente una actividad tuya una vez, para mover tu aplicación fuera de este estado detenido. Por favor, lea la publicación de blog vinculada en mi respuesta. – CommonsWare

+0

No funcionó. Quiero decir que agregué Activity y lo ejecuté, pero aún así no puedo capturar "android.intent.action".MEDIA_BUTTON ", incluso cuando Activity está ejecutando mi receptor, obtienes este intento. –

2

Si solo quiere que su aplicación sea la predeterminada, pero no necesita hacer nada con el botón, puede usar el siguiente método.

Esto, unido al archivo de manifiesto (en el nodo "Aplicación"):

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

añadir esto a onCreate() en la actividad principal o en cualquier lugar que quieren que se llama cuando se ejecuta la aplicación. Podría ser útil en el caso onResume() también:

mAudioManager = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE); 
    mRemoteControlResponder = new ComponentName(getActivity().getPackageName(), BroadcastReceiver.class.getCanonicalName()); 

    mAudioManager.registerMediaButtonEventReceiver(mRemoteControlResponder); 
Cuestiones relacionadas