2012-06-20 5 views
0

가능한 중복 오디오 다시 시작하는 방법 : 일시 중지하고 전화 통화


Stopping & Starting music on incoming calls

내가 MediaPlayer를 클래스를 사용하여 일부 오디오를 재생하는 간단한 응용 프로그램이 있습니다. 내 응용 프로그램을 디버깅하는 동안 나는 오디오가 수신 및 발신 통화 중에도 계속 재생되는 것을 발견했습니다.

내 문제의 해결책은 phoneStateListener를 사용하고있는 것으로 나타났습니다. 나는 이것을 어떻게하는지 잘 모른다. PhoneStateListener와 함께 BroadcastReceiver를 사용하는 몇 가지 예를 보았고 왜 BroadCastReceiver가 필요한지 이해할 수 없었습니다.

누군가가 PhoneStateListener의 샘플 구현을 제공 할 수 있다면 감사하겠습니다. 전화 상태를 얻을 수 있다면 MediaPlayer 객체가 전체 응용 프로그램에 대해 전역이므로 오디오를 일시 중지하거나 다시 시작할 수 있습니다.

+0

나는 그 게시물을 보았다. 어디에서 그 코드를 정확히 추가합니까? 나는 그것을 추가 할 곳과 PhoneStateReciever가 어떻게 호출되는지 이해하지 못한다. – AndroidDev93

답변

1

이것은 내가 사용하는 것입니다 ... 전화 상태가 변경 될 때마다 onCallStateChanged() 함수는 모든 PhoneStateListeners에서 호출되므로 처리해야합니다. 당신이 당신의 현재 활동에이를 추가하려는 경우,이

import android.telephony.PhoneStateListener; 
import android.telephony.TelephonyManager; 

//Makes sure the audio is paused for incoming/outgoing phone calls 
public class ListenToPhoneState extends PhoneStateListener { 

    private boolean pausedForPhoneCall = false; 
    private UIManager uiManager; 

    ListenToPhoneState(UIManager manager){ 
     uiManager = manager; 
    } 

    @Override 
    public void onCallStateChanged(int state, String incomingNumber) { 

     switch (state) { 
      case TelephonyManager.CALL_STATE_IDLE: 
       resumeInAndroid(); 
       return; 
      case TelephonyManager.CALL_STATE_OFFHOOK: 
       pauseInAndroid();    
       return; 
      case TelephonyManager.CALL_STATE_RINGING: 
       pauseInAndroid();    
       return; 
     } 
    } 

    private void resumeInAndroid(){ 
     if(pausedForPhoneCall == true) { 
      pausedForPhoneCall=false; 
      uiManager.waitForPhoneCall(false); 
     } 
    } 

    private void pauseInAndroid(){ 
     if(pausedForPhoneCall == false){ 
      pausedForPhoneCall=true; 
      uiManager.waitForPhoneCall(true); 
     } 
    } 

    String stateName(int state) { 
     switch (state) { 
      case TelephonyManager.CALL_STATE_IDLE: return "Idle"; 
      case TelephonyManager.CALL_STATE_OFFHOOK: return "Off hook"; 
      case TelephonyManager.CALL_STATE_RINGING: return "Ringing"; 
     } 
     return Integer.toString(state); 
    } 
} 

할 ...

ListenToPhoneState listener = new ListenToPhoneState(userInterface); 
     TelephonyManager tManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 
     if(tManager != null) 
      tManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE); 

당신은 오히려 당신의 현재 활동을 중단하지 않을까요? 클래스에 현재 액티비티의 인스턴스를 전달하면, 정말로 원한다면 finish()를 호출하고 switch 문에서 새로운 액티비티 권한을 생성 할 수있다.

+0

안드로이드는 전화가 왔을 때 자동으로 onCallStateChanged 함수를 호출합니까? – AndroidDev93

+0

예, PhoneStateListener 클래스를 확장하면 해당 클래스를 OS에 등록하고 onCallStateChanged 함수를 재정의하면 전화 통화 상태가 변경 될 때마다 해당 함수가 OS에 의해 호출됩니다. – Joel

+0

아, 고마워! 어쨌든이 수업에서 의도를 사용하여 활동을 시작할 수 있습니까? 따라서 OFF_HOOK의 경우 다른 활동을 시작하고 싶습니다. – AndroidDev93

관련 문제