2012-05-10 6 views
7

Ich schrieb einen Dienst, der BroadcastReceiver verwendet, um eine der Media-Tasten ("Play-Taste" von einem Headset) zu erfassen, und es funktioniert perfekt auf Android 2.3.x (HTC Nexus One oder HTC Desire)Capture Media Button auf Android> = 4.0 (funktioniert auf 2.3)

Wenn ich versuchte, auf Android 4.0.3 (Samsung Nexus S) läuft es nicht funktioniert (meine Anwendung erhält keine Absicht "android.intent.action.MEDIA_BUTTON" und " play "Taste verhält sich wie gewohnt: stoppt/startet Musik.

Inhalt des manifest:

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

Gibt es so, wie es auf Android 4.0.3


bearbeiten arbeiten zu machen: Ich habe vorgeschlagene Lösung versuchen, ich habe hinzugefügt Aktion und laufen es, aber mein Empfänger erhält immer noch keine Absicht. Was ist seltsamer Registrierung Empfänger durch Code funktioniert auch nicht:

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

Jetzt bin ich total verwirrt.

+0

Beachten Sie auch, dass Intent Priorität größer als -1000 sein muss und weniger als 1000. – William

Antwort

12

Stellen Sie sicher, dass Sie eine Aktivität in Ihrer App haben und dass der Benutzer diese Aktivität ausführt, bevor Sie versuchen, diese Schaltfläche zu drücken. Bis dahin, Ihre <receiver>will not receive any broadcasts.


UPDATE

auf Android 4.0 und höher, scheint es, dass Sie müssen auch registerMediaButtonEventReceiver() on AudioManager aufrufen, um die Ereignisse zu empfangen. Dieser Zustand wird beibehalten, bis etwas anderes ruft registerMediaButtonEventReceiver() oder bis Sie unregisterMediaButtonEventReceiver() anrufen.

Zum Beispiel eine Tätigkeit wie folgt aus:

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

ermöglicht eine manifest registriert MediaButtonReceiver ACTION_MEDIA_BUTTON Ereignisse zu erhalten.

+0

Ich habe nur den Dienst bekam die Spracherkennung läuft und sendet einige andere intets . Dies funktioniert gut auf Android 2.3.x. Ist das nur eine mögliche Lösung? Laufende Aktivität erfordert aktiven Bildschirm, um Intents zu empfangen und das ist nicht akzeptabel für mich .. –

+0

@MarekR: "Ist das nur mögliche Fix?" - Ja, obwohl ich vermute, dass Sie den Fix nicht verstanden haben. Sie müssen die Aktivität nicht laufen lassen. Sie müssen nur einmal eine Ihrer Aktivitäten manuell starten, um Ihre App aus diesem gestoppten Zustand zu entfernen. Bitte lesen Sie den verlinkten Blogpost in meiner Antwort. – CommonsWare

+0

Es hat nicht funktioniert. Ich meine, ich habe Aktivität hinzugefügt und es ausgeführt, aber ich kann noch nicht "android.intent.action" erfassen.MEDIA_BUTTON ", auch wenn Aktivität läuft mein Empfänger erhalten diese Absicht. –

2

Wenn Sie möchten, dass Ihre App als Standard verwendet wird, aber nichts mit dem Drücken der Taste zu tun hat, können Sie die folgende Methode verwenden.

Fügen Sie diese auf die Manifest-Datei (in dem „Application“ Knoten):

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

hinzufügen Zu onCreate() in der Haupttätigkeit oder wo immer Sie wollen, dass aufgerufen wird, wenn die Anwendung ausgeführt wird. Könnte auch in der onResume() Ereignis nützlich sein:

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

    mAudioManager.registerMediaButtonEventReceiver(mRemoteControlResponder);