32 Stimmen

Wie erkennt man, wenn ein Benutzer Kopfhörer an ein Android-Gerät anschließt? (Gegenteil von ACTION_AUDIO_BECOMING_NOISY)

Ich entwickle eine Anwendung, die folgende Anforderung hat: Wenn ein Kopfhörer an das Gerät angeschlossen ist und der Benutzer ihn entfernt, muss ich alle Streams stummschalten. Dazu muss ich den Broadcast AudioManager.ACTION_AUDIO_BECOMING_NOISY abhören. Das ist in Ordnung! Hier besteht kein Problem.

Aber wenn der Benutzer den Kopfhörer wieder anschließt, muss ich das Gerät wieder stummschalten. Es gibt jedoch keinen entsprechenden Broadcast wie AudioManager.ACTION_AUDIO_BECOMING_NOISY. Ich kann also nicht wissen, wann der Kopfhörer wieder angeschlossen wird.

Eine Lösung besteht darin, regelmäßig zu überprüfen, ob AudioManager.isWiredHeadsetOn() true ist, aber das scheint mir keine gute Lösung zu sein.

Gibt es eine Möglichkeit zu erkennen, wenn der Benutzer einen Kopfhörer an das Gerät anschließt?

Bearbeitet: Ich habe versucht, Intent.ACTION_HEADSET_PLUG auf diese Weise zu verwenden, aber es hat nicht funktioniert.

In der Manifest.xml habe ich Folgendes hinzugefügt:

Und hier ist der Code meiner MusicIntentReceiver.java:

public class MusicIntentReceiver extends BroadcastReceiver {

    public void onReceive(Context ctx, Intent intent) {
        AudioManager audioManager = (AudioManager)ctx.getSystemService(Context.AUDIO_SERVICE);
        if (intent.getAction().equals(Intent.ACTION_HEADSET_PLUG)) {
            Log.d("Lass uns den Ton wieder einschalten!");
            //andere Dinge, um die Streams wieder zu aktivieren
        }
    }
}

Gibt es eine andere Lösung, die ich ausprobieren kann?

90voto

emrys57 Punkte 6509

Wie wäre es mit diesem Aufruf: http://developer.android.com/reference/android/content/Intent.html#ACTION_HEADSET_PLUG den ich gefunden habe auf Droid Incredible Headphones Detection ?

Der aktualisierte Code, den ich in Ihrer Frage jetzt sehe, reicht nicht aus. Dieser Broadcast findet statt, wenn sich der eingesteckte Zustand ändert und manchmal auch, wenn es nicht der Fall ist, gemäß Intent.ACTION_HEADSET_PLUG wird empfangen, wenn die Aktivität startet also würde ich schreiben:

package com.example.testmbr;

import android.os.Bundle;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;

public class MainActivity extends Activity  {
private static final String TAG = "MainActivity";
private MusicIntentReceiver myReceiver;

@Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    myReceiver = new MusicIntentReceiver();
}

@Override public void onResume() {
    IntentFilter filter = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
    registerReceiver(myReceiver, filter);
    super.onResume();
}

private class MusicIntentReceiver extends BroadcastReceiver {
    @Override public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_HEADSET_PLUG)) {
            int state = intent.getIntExtra("state", -1);
            switch (state) {
            case 0:
                Log.d(TAG, "Kopfhörer sind ausgesteckt");
                break;
            case 1:
                Log.d(TAG, "Kopfhörer sind eingesteckt");
                break;
            default:
                Log.d(TAG, "Ich habe keine Ahnung, was der Kopfhörerzustand ist");
            }
        }
    }
}

@Override public void onPause() {
    unregisterReceiver(myReceiver);
    super.onPause();
}
}

Der AudioManager.isWiredHeadsetOn() Aufruf, den ich zuvor empfohlen habe, stellte sich als veraltet seit API 14 heraus, also habe ich ihn durch das Extrahieren des Zustands aus dem Broadcast-Intent ersetzt. Es ist möglich, dass es mehrere Broadcasts für das Einstecken oder Ausstecken geben könnte, vielleicht wegen des Kontaktsprungs im Anschluss.

2voto

Steve Blackwell Punkte 5859

Ich habe damit nicht gearbeitet, aber wenn ich die Dokumentation richtig lese, ist ACTION_AUDIO_BECOMING_NOISY dafür gedacht, einer App mitzuteilen, dass der Audioeingang möglicherweise den Audioausgang empfängt. Wenn Sie das Headset abziehen, kann das Mikrofon des Telefons möglicherweise den Lautsprecher des Telefons aufnehmen, daher die Meldung.

Andererseits ist ACTION_SCO_AUDIO_STATE_UPDATED dazu gedacht, Sie über eine Änderung im Verbindungszustand eines Bluetooth-Geräts zu informieren.

Das ist wahrscheinlich das, worauf Sie hören möchten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X