wake-up-neo.com

Stoppen und Starten von Musik bei eingehenden Anrufen

Ich habe eine Aktivität implementiert, die Medien von einer URL in Android wiedergibt

Um die Pausenfunktion bei eingehenden Anrufen zu erweitern, habe ich einen Empfänger erstellt, der bei eingehenden Anrufen eine Variable festlegt. Die Aktivität liest diese Variable und pausiert dann die Musik in ihrer onPause () -Methode und setzt sie zurück, wenn der Aufruf beendet ist und die Aktivität die Musik in ihrer onResume () -Methode fortsetzt

Dies funktioniert gut, solange die Aktivität den Fokus hat. Wenn ich während der Musikwiedergabe zum Startbildschirm zurückkehre und dann der Anruf eingeht, wird die Pause der Aktivität nicht aufgerufen und daher kann ich die Musik stoppen und starten

Was ist der Ausweg dafür? Hat jemand einen Media Player implementiert, der eingehende und ausgehende Anrufe jederzeit abfängt und die Musik korrekt anhält und startet?

54
user669231

Es gibt ein paar Dinge, die Sie tun können:

Zunächst können Sie mit einem PhoneStateListener auf Änderungen im Anrufstatus warten. Sie können den Listener im TelephonyManager registrieren:

PhoneStateListener phoneStateListener = new PhoneStateListener() {
    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
        if (state == TelephonyManager.CALL_STATE_RINGING) {
            //Incoming call: Pause music
        } else if(state == TelephonyManager.CALL_STATE_IDLE) {
            //Not in call: Play music
        } else if(state == TelephonyManager.CALL_STATE_OFFHOOK) {
            //A call is dialing, active or on hold
        }
        super.onCallStateChanged(state, incomingNumber);
    }
};
TelephonyManager mgr = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
if(mgr != null) {
    mgr.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
}

Denken Sie daran, die Registrierung des Listeners aufzuheben, wenn er nicht mehr benötigt wird. Verwenden Sie dazu den PhoneStateListener.LISTEN_NONE:

TelephonyManager mgr = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
if(mgr != null) {
    mgr.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE);
}

Weitere Informationen finden Sie in der Dokumentation .

Sie können auch die Sendung abhören Android.intent.action.PHONE_STATE. Es wird das Extra TelephonyManager.EXTRA_STATE Enthalten, das Sie über den Anruf informiert. Schauen Sie sich die Dokumentation hier an .

Bitte beachten Sie, dass Sie in beiden Fällen die Android.permission.READ_PHONE_STATE - Berechtigung benötigen.

91
Kaloer

Ich denke, dass AudioManager die beste und schnellste Lösung ist. Hier gibt es mein Implementierungsbeispiel:

public class MyActivity extends Activity implements OnAudioFocusChangeListener {

private AudioManager mAudioManager;

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    mAudioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
    ...
}

@Override
 public void onDestroy(){
     super.onDestroy();
     ...
     mAudioManager.abandonAudioFocus(this);
     ...
 }


@Override
public void onAudioFocusChange(int focusChange) {
    if(focusChange<=0) {
        //LOSS -> PAUSE
    } else {
        //GAIN -> PLAY
    }
}   

}

Ich hoffe es ist hilfreich für dich :-)

49
mickesource

ODER - Sie können eine Empfängeranwendung ausprobieren.

Erstellen Sie einen Empfänger mit dem Namen CallRecord.Java

package com.example.callreceiver;

import Android.content.BroadcastReceiver;
import Android.content.Context;
import Android.content.Intent;
import Android.telephony.PhoneStateListener;
import Android.telephony.TelephonyManager;

public class CallReceiver extends BroadcastReceiver{
    TelephonyManager telManager;
    Context context;

@Override
public void onReceive(Context context, Intent intent) {


    this.context=context;

    telManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
    telManager.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE);

}

private final PhoneStateListener phoneListener = new PhoneStateListener() {
    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
        try {
            switch (state) {
            case TelephonyManager.CALL_STATE_RINGING: {
                //PAUSE
            break;
            }
            case TelephonyManager.CALL_STATE_OFFHOOK: {

            break;
            }
            case TelephonyManager.CALL_STATE_IDLE: {
                //PLAY
            break;
            }
            default: { }
            }
            } catch (Exception ex) {

            }
        }
    };
 }

Fügen Sie dann diese Zeile in die Datei manifest.xml ein, um sie in der App zu registrieren

<receiver Android:name="CallReceiver" >
        <intent-filter>
            <action Android:name="Android.intent.action.PHONE_STATE" >
            </action>
        </intent-filter>
    </receiver>
13
kulakesh

Ich denke requestAudioFocus () sollte diesen Fall automatisch behandeln können. Sie müssen den Anrufstatus nicht explizit überprüfen.

Audio Focus ist von Natur aus kooperativ. Das heißt, von Anwendungen wird erwartet (und nachdrücklich empfohlen), dass sie den Richtlinien für den Audiofokus entsprechen, aber die Regeln werden vom System nicht durchgesetzt. Wenn eine Anwendung auch nach dem Verlust des Audiofokus laute Musik abspielen möchte, kann dies durch nichts im System verhindert werden. Es ist jedoch wahrscheinlicher, dass der Benutzer eine schlechte Erfahrung macht, und es ist wahrscheinlicher, dass er die fehlerhafte Anwendung deinstalliert.

Um den Audiofokus anzufordern, müssen Sie requestAudioFocus () vom AudioManager aus aufrufen, wie das folgende Beispiel zeigt:

AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
int result = audioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC,
AudioManager.AUDIOFOCUS_GAIN);

if (result != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
    // could not get audio focus.
}
12
Shiv

IMHO besserer Weg ist in off docs beschrieben: http://developer.Android.com/training/managing-audio/audio-focus.html

5
Anton Balashov

Für mich kam der Ruhezustand, als ein Anruf einging. Die schnelle Lösung besteht darin, den Rundfunkempfänger einzuchecken

BroadcastReceiver phonestatereceiver = new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
    Bundle extras = intent.getExtras();
    if (extras != null) {
      String state = extras.getString(TelephonyManager.EXTRA_STATE);
      if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
        //pause here
      }
      else if (state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {
        //pause here
      }
      else if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)) {
        //play here
      }
    }
  }
};
2