2012-05-10 17 views
7

Ho scritto un servizio che utilizza BroadcastReceiver per acquisire uno dei pulsanti multimediali ("tasto play" da un auricolare) e funziona perfettamente su Android 2.3.x (HTC Nexus One o HTC Desire)Pulsante media acquisizione su Android> = 4.0 (funziona su 2.3)

Quando ho provato a eseguire su Android 4.0.3 (Samsung Nexus S) non funziona (la mia applicazione non riceve intento "android.intent.action.MEDIA_BUTTON" e " play "si comporta come al solito: ferma/avvia la musica).

Contenuto dei manifesti:

... 
<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> 
... 

C'è modo per farlo funzionare su Android 4.0.3


EDIT: ho provare soluzione proposta, che ho l'azione ed eseguire aggiunto ma il mio ricevitore continua a non ricevere intenzioni. Che cosa è più strano ricevitore registrazione per codice, inoltre, non funziona:

@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)); 
} 

Ora io sono totalmente confuso.

+0

Si noti inoltre che la priorità intenti deve essere maggiore di -1000 e meno di 1000. – William

risposta

12

Assicurati di avere un'attività nella tua app e che l'utente esegua questa attività prima di provare a premere quel pulsante. Fino ad allora, il tuo <receiver>will not receive any broadcasts.


UPDATE

Su Android 4.0 e versioni successive, sembra che è anche necessario chiamare registerMediaButtonEventReceiver() on AudioManager al fine di ricevere gli eventi. Questo stato si manterrà fino a quando qualcos'altro chiama registerMediaButtonEventReceiver() o finché non si chiama unregisterMediaButtonEventReceiver().

Per esempio, un'attività come questa:

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)); 
    } 
} 

consentirà un manifesto registrato MediaButtonReceiver per ottenere eventi ACTION_MEDIA_BUTTON.

+0

ho solo il servizio che gestisce il riconoscimento vocale e invia alcuni altri intets . Funziona bene su Android 2.3.x. Questa è solo la correzione possibile? L'attività in esecuzione richiede uno schermo attivo per ricevere intenti e questo non è accettabile per me. –

+0

@MarekR: "Questa è solo la correzione possibile?" - Sì, anche se sospetto che tu non abbia capito la correzione. Non devono lasciare l'attività in esecuzione. Devono solo avviare manualmente un'attività tua una volta, per spostare l'app fuori da questo stato di arresto. Si prega di leggere il post sul blog collegato alla mia risposta. – CommonsWare

+0

Non ha funzionato. Significo che ho aggiunto Activity ed eseguito, ma ancora non riesco a catturare "android.intent.action.MEDIA_BUTTON ", anche quando Activity sta eseguendo il mio ricevitore, ottengo questo intento. –

2

Se si desidera che l'app sia l'impostazione predefinita ma non è necessario eseguire alcuna operazione con il pulsante, è possibile utilizzare il seguente metodo.

aggiungere questo al file manifesto (nel nodo "Applicazione"):

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

Aggiungi questo al onCreate() nell'attività principale o ovunque tu voglia che viene chiamato quando l'applicazione viene eseguita. Potrebbe essere utile in() evento onResume troppo:

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

    mAudioManager.registerMediaButtonEventReceiver(mRemoteControlResponder); 
Problemi correlati