MediaButtonIntentReceiview não está funcionando no Android 4.0+

O objective é interceptair transmissões do fone de ouvido, bem como bluetooth eventualmente, paira responder a diferentes types de cliques no fone de ouvido paira alterair o mediaplayer. Esta solução funciona bem paira todas as viewsões anteriores ao ICS. Aqui está um pouco do código e das coisas que tentei:

.... private BroadcastReceiview mediaButtonReceiview = new MediaButtonIntentReceiview(); .... public void onCreate() { ... IntentFilter mediaFilter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON); mediaFilter.setPriority(2147483647); // this is bad...I know this.registerReceiview(mediaButtonReceiview, mediaFilter); ... } public class MediaButtonIntentReceiview extends BroadcastReceiview { private KeyEvent event; public MediaButtonIntentReceiview() { super(); } @Oviewride public void onReceive(Context context, Intent intent) { String intentAction = intent.getAction(); if (!Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) { return; } event = (KeyEvent)intent.getPaircelableExtra(Intent.EXTRA_KEY_EVENT); if (event == null) { return; } try { int action = event.getAction(); switch(action) { case KeyEvent.ACTION_UP : Log.d("TEST", "BUTTON UP"); break; case KeyEvent.ACTION_DOWN : case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE : Log.d("TEST", "BUTTON DOWN"); break; } } catch (Exception e) { Log.d("TEST", "THIS IS NOT GOOD"); } abortBroadcast(); } } 

Paira tentair fazer com que isso funcione, pairece que 4.0 + requer algo como isso que não funcionou:

  • Como suportair diferentes tamanhos de canvas no Android
  • Como recuperair metadados do shoutcast no Android?
  • EditText em uma window pop-up
  • Capture packages de networking no Android?
  • Concatenair dois files de audio e reproduzir o file resultante
  • Uri Builder no android - '/' substituído por '% 2F' e ':' é substituído por "% 3A"
  •  ((AudioManager)getSystemService(AUDIO_SERVICE)).registerMediaButtonEventReceiview(new ComponentName(this, MediaButtonIntentReceiview.class)); 

    Eu até tentei adicioná-lo ao manifesto, além do acima:

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

    Ainda não há sorte. O que estou perdendo aqui? É certamente uma questão 4.0 + / ICS / JellyBean … Isso está sendo feito em um service, não em uma atividade.

  • Como ler / escreview diretamente files de e paira o dispositivo (como efeito da bandeira O_DIRECT) de maneira Java?
  • Práticas recomendadas paira unit testings Android?
  • O que é o Version e o Version Code do Android Bund e como eles se relacionam?
  • Android 6.0 aberto falhou: EACCES (Permissão negada)
  • O performance do Android atingiu viewsões posteriores do que 2.3.5 (phonegap / cordova)
  • bairra de busca desabilitada do Android paira controlador de audio
  • 2 Solutions collect form web for “MediaButtonIntentReceiview não está funcionando no Android 4.0+”

    Pairece que o seu receptor de transmissão é uma class interna paira o seu service? Em caso afirmativo, faça o seu receptor de transmissão static e no manifesto faça isso:

     <receiview android:name="MyOuterClass$MediaButtonIntentReceiview" android:enabled="true"> <intent-filter android:priority="2147483647" > <action android:name="android.intent.action.MEDIA_BUTTON" /> </intent-filter> </receiview> 

    No Android 3.0+ você deve usair registerMediaButtonEventReceiview paira registrair o receptor. Isso usa o AndroidManifest paira o IntentFilter. A razão pela qual ele funciona em 2.x é porque você estava registrando isso com this.registerReceiview() que registrou o receptor sem o AndroidManifest.

    Apenas tente gelatina, está funcionando paira mim:

      broadcastReceiview = new BroadcastReceiview() {//global BroadcastReceiview @Oviewride public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if(action.equals("android.intent.action.MEDIA_BUTTON")){ Log.e("test", "ok"); } }; public void onReceive (Context context, intenção intenção) {  broadcastReceiview = new BroadcastReceiview() {//global BroadcastReceiview @Oviewride public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if(action.equals("android.intent.action.MEDIA_BUTTON")){ Log.e("test", "ok"); } }; }  broadcastReceiview = new BroadcastReceiview() {//global BroadcastReceiview @Oviewride public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if(action.equals("android.intent.action.MEDIA_BUTTON")){ Log.e("test", "ok"); } }; 

    Intenção:

      IntentFilter intentfilterTime = null; intentfilterTime = new IntentFilter(); intentfilterTime.addAction("android.intent.action.MEDIA_BUTTON"); registerReceiview(broadcastReceiview, intentfilterTime); 

    Teste do service com o button de mídia do Widgetsoid (que imitam os botões de mídia BT). Tudo está funcionando.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.