2012-04-16 3 views
16

Sto scrivendo un'applicazione Android per la versione 4.0.3 (ICS) del sistema operativo Android. Il problema è che non ricevo l'output dal mio Log.d() nel metodo onReceive() di BroadcastReceiver, il che significa che la mia applicazione non gestisce correttamente la trasmissione.BroadcastReceiver per ACTION_MEDIA_BUTTON non funziona

Ho letto innumerevoli domande su come eseguire il codice quando si fa clic su ACTION_MEDIA_BUTTON. Ho persino copiato + codice incollato quando il mio non ha funzionato, solo per vedere se avrebbe funzionato.

L'ACTION_MEDIA_BUTTON che voglio gestire è il pulsante singolo su auricolari che permettono a un utente di chiamate pick-up/fine, play/pausa musica. Invece della mia applicazione che gestisce questo pulsante, quando clicco su di esso, il lettore di musica in stock sul mio Nexus S Android inizia a riprodurre un brano.

Non ho inserito il mio codice in un'altra classe, forse questo è il motivo per cui non funziona?

Ecco il codice trovato sul metodo onCreate() (questo codice specifico ho copiato fuori un sito web dopo il codice che ho scritto non ha funzionato):

IntentFilter mediaButtonFilter = new IntentFilter(
      Intent.ACTION_MEDIA_BUTTON); 
    mediaButtonFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); 
    BroadcastReceiver brMediaButton = new BroadcastReceiver() { 
     public void onReceive(Context context, Intent intent) { 
      Log.d("Event", "Media button!"); 
      this.abortBroadcast(); 

      KeyEvent key = (KeyEvent) intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); 
      if(key.getAction() == KeyEvent.ACTION_UP) { 
       int keycode = key.getKeyCode(); 
       if(keycode == KeyEvent.KEYCODE_MEDIA_NEXT) { 
        Log.d("TestApp", "Next Pressed"); 
       } else if(keycode == KeyEvent.KEYCODE_MEDIA_PREVIOUS) { 
        Log.d("TestApp", "Previous pressed"); 
       } else if(keycode == KeyEvent.KEYCODE_HEADSETHOOK) { 
        Log.d("TestApp", "Head Set Hook pressed"); 
       } 
      } 

     } 
    }; 
    registerReceiver(brMediaButton, mediaButtonFilter); 

Tutto quello che ho davvero bisogno di verificare è la KEYCODE_HEADSETHOOK ma non fa male avere l'altro codice lì per il test, lo aggiusterò una volta che posso far funzionare tutto correttamente.

Nel mio manifesto:

<intent-filter android:priority="2147483647" > 
      <action android:name="android.intent.action.MEDIA_BUTTON" /> 
</intent-filter> 

Originariamente ho pensato che questo potrebbe essere un problema di autorizzazioni dal momento che non ha specificato alcuna autorizzazioni per questo però non ho ricevuto alcun messaggio di errore.

Come ho detto prima, ho provato molte varianti di questo. Un esempio è stato l'uso del codice a questo collegamento broadcastreceiver onReceive problem ACTION_MEDIA_BUTTON Android con le correzioni di CommonsWare. Di nuovo, tuttavia, l'ho modificato in modo che non fosse in una classe separata.

Grazie in anticipo per il vostro aiuto.

+0

Si prega di controllare [questo] (http://stackoverflow.com/questions/3369554/how-to-handle-long-press-media-button-in-order-to -launch-attività) e [questo] (http://stackoverflow.com/questions/6603170/broadcastreceiver-onreceive-problem-action-media-button-android) Spero che questo risolverà il vostro problema – silwar

+0

ho quasi lo stesso codice di te e funziona perfettamente su Android 2.2/2.3. Ma come te non posso farlo funzionare con ICS ... – user1026605

+0

Lo stesso qui. Funziona prima di Android 4.0. L'API è cambiata o qualcosa del genere. – joepetrakovich

risposta

8

Ho provato questo su un Samsung Galaxy S5 con Android 4.4.2. Quindi, ciò che è importante e ciò che non menzionata in altri post:

  • registrare il ricevitore in AndroidManifest.xml all'interno dell'applicazione tag ma fuori da ogni attività tag.
  • Il ricevitore Broadcastreceiver necessità di essere pubblico e statico
  • Un'attività bisogno di registrare un MediaButtonEventReceiver ad ascoltare per le pressioni di tasti

posto e qui qualche codice esempio:

mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
mReceiverComponent = new ComponentName(this,YourBroadcastReceiver.class); 
... 
mAudioManager.registerMediaButtonEventReceiver(mReceiverComponent); 
... 
// somewhere else 
mAudioManager.unregisterMediaButtonEventReceiver(mReceiverComponent); 

Qui il ricevitore :

public static class YourBroadcastReceiver extends BroadcastReceiver{ 

    // Constructor is mandatory 
    public MediaBroadcastReceiver() 
    { 
     super(); 
    } 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     String intentAction = intent.getAction(); 
     Log.i (TAG_MEDIA, intentAction.toString() + " happended"); 
     if (!Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) { 
      Log.i (TAG_MEDIA, "no media button information"); 
      return; 
     } 
     KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); 
     if (event == null) { 
      Log.i (TAG_MEDIA, "no keypress"); 
      return; 
     } 
     // other stuff you want to do 
    } 
} 

E qui il manifesta snippet. Se necessario la priorità aggiuntivo per l'intent-filtro, ma non era necessario per me:

<application> 
    <receiver android:name="OuterClass$YourBroadcastReceiver"> 
     <intent-filter> 
      <action android:name="android.intent.action.MEDIA_BUTTON" /> 
     </intent-filter> 
    </receiver> 
    <activity> ... </activity> 
</application> 

Per i riferimenti:

+0

Sto cercando di implementare lo stesso nel dispositivo Samsung quando la mia attività in background suReceive() chiama sempre ma in nexus onReceive() non viene mai chiamata in background. puoi spiegare perché? –

4
mediaButtonReceiver = new ComponentName(getPackageName(), MediaButtonReceiver.class.getName()); 

mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 

mAudioManager.registerMediaButtonEventReceiver(mediaButatonReceiver); 

Questo codice vincolare il proprio tasto cuffia per la vostra applicazione e la vostra applicazione solo fino a quando si chiama:

mAudioManager.unregisterMediaButtonEventReceiver(mediaButatonReceiver); 
+3

O fino a quando altre app chiamano 'registerMediaButtonEventReceiver() ', Vorrei dire;) – cprcrack

+0

Dove posso registrare la trasmissione. Ho registrato il Ricevitore nel file manifest solo –