web-dev-qa-db-fra.com

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

J'ai mis en œuvre une activité qui lit des médias à partir d'une URL dans Android

Afin d'ajouter une fonctionnalité de pause lorsque l'appel entrant arrive, j'ai créé un récepteur qui définit une variable lorsque l'appel arrive. L'activité lit cette variable, puis met la musique en pause dans sa méthode onPause () et se réinitialise lorsque l'appel est terminé et que l'activité reprend la musique dans sa méthode onResume ()

Cela fonctionne bien tant que l'activité est focalisée. Si je reviens à l'écran d'accueil pendant la lecture de la musique, puis que l'appel arrive, la pause de l'activité n'est pas appelée et je peux donc arrêter et démarrer la musique

Quelle est la solution pour cela? Quelqu'un a-t-il mis en place un lecteur multimédia pour qu'il intercepte les appels entrants et sortants à tout moment et s'arrête et démarre la musique correctement?

54
user669231

Il y a plusieurs choses que vous pouvez faire:

Tout d'abord, vous pouvez écouter les changements dans l'état d'appel en utilisant un PhoneStateListener. Vous pouvez enregistrer l'auditeur dans 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);
}

N'oubliez pas de désinscrire l'auditeur lorsqu'il n'est plus nécessaire en utilisant le PhoneStateListener.LISTEN_NONE:

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

Pour plus d'informations, lisez la documentation .

Une autre chose que vous pouvez faire est d'écouter la diffusion Android.intent.action.PHONE_STATE. Il contiendra le supplément TelephonyManager.EXTRA_STATE Qui vous donnera des informations sur l'appel. Jetez un œil à la documentation ici .

Veuillez noter que vous aurez besoin de l'autorisation Android.permission.READ_PHONE_STATE Dans les deux cas.

91
Kaloer

Je pense qu'AudioManager est la meilleure solution et la plus 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 cela vous sera utile :-)

49
mickesource

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

Créez un récepteur 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) {

            }
        }
    };
 }

Ensuite, ajoutez 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>
13
kulakesh

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

Audio Focus est de nature coopérative. Autrement dit, les applications sont censées (et fortement encouragées) respecter les directives de mise au point audio, 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 avoir perdu la mise au point audio, rien dans le système ne l'empêchera. Cependant, l'utilisateur est plus susceptible d'avoir une mauvaise expérience et sera plus susceptible de désinstaller l'application qui se comporte mal.

Pour demander le focus audio, vous devez appeler requestAudioFocus () à partir d'AudioManager, comme le montre l'exemple ci-dessous:

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 meilleure façon est décrite dans les documents hors: http://developer.Android.com/training/managing-audio/audio-focus.html

5
Anton Balashov

Pour moi, l'état inactif arrivait alors qu'il y avait un appel entrant, la solution rapide est de 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
      }
    }
  }
};
2