65 votes

Arrêter et démarrer la musique sur les appels entrants

J'ai mis en place une Activité qui joue médias à partir d'une URL dans android

Pour ajouter une pause de fonctionnalités lors de l'appel entrant, j'ai créé un récepteur, qui définit une variable lors de l'appel. L'activité lit cette variable, puis s'arrête de la musique dans sa onPause() la méthode et réinitialise est lorsque l'appel est terminé et la reprise de l'activité de la musique dans son onResume() la méthode

Cela fonctionne bien aussi longtemps que l'activité qui a le focus. Si je reviens à l'écran d'accueil, tandis que la musique joue, puis la réception de l'appel, l'activité du onpause n'est pas appelé, & par conséquent, je peux " stop & start, la musique

Quel est le moyen de sortir de cette situation? Quelqu'un mis en place un media player de sorte qu'il intercepte les appels entrants et sortants à tous les temps & s'arrête et démarre la musique correctement?

97voto

Kaloer Points 2654

Il ya quelques choses que vous pouvez faire:

Tout d'abord, vous pouvez écouter les changements dans l'état de l'appel à l'aide d'un PhoneStateListener. Vous pouvez vous inscrire à l'auditeur dans le TelephonyManager:

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

Pensez à annuler l'inscription de l'auditeur lorsqu'il n'est plus besoin de l'aide de l' PhoneStateListener.LISTEN_NONE:

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

Pour plus d'informations, consultez la documentation.

Une autre chose que vous pouvez faire est à l'écoute de l'émission android.intent.action.PHONE_STATE. Il contiendra les extra - TelephonyManager.EXTRA_STATE qui vous donnera des informations sur l'appel. Jetez un oeil à la documentation ici.

Veuillez noter que vous aurez besoin de l' android.permission.READ_PHONE_STATE-autorisation dans les deux cas.

58voto

mickesource Points 21

Je pense que AudioManager est la solution la meilleure et rapide. Voici mon exemple d'implémentation:

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

}

J'espère que ça vous aidera :-)

13voto

kulakesh Points 51

OU - Vous pouvez essayer une application de récepteur.

Créez un destinataire nommé 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) {

            }
        }
    };
 }
 

Ajoutez ensuite cette ligne dans le fichier manifest.xml pour l'enregistrer sur l'application.

 <receiver android:name="CallReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.PHONE_STATE" >
            </action>
        </intent-filter>
    </receiver>
 

13voto

spanjeta Points 808

Je pense que requestAudioFocus() doit être capable de gérer ce cas automatiquement. Vous n'avez pas besoin de vérifier l'état de l'appel explicitement.

Audio Accent sur la coopération dans la nature. Que les applications sont attendues (et fortement encouragés) à se conformer à l'audio focus lignes directrices, mais les règles ne sont pas appliquées par le système. Si une application veut jouer de la musique forte, même après la perte de l'audio focus, rien dans le système permettra d'éviter que. Toutefois, l'utilisateur est plus susceptible d'avoir une mauvaise expérience et seront plus susceptibles de désinstaller le mauvais comportement de l'application.

À la demande de l'audio, vous devez appeler requestAudioFocus() de la AudioManager, comme dans l'exemple ci-dessous montre:

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

2voto

Inder Kumar Rathore Points 13538

Pour moi, l'état d'inactivité approchait alors qu'il y avait un appel entrant, la solution rapide consiste à vérifier le récepteur de diffusion.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X