BroadcastReceiver中的传入和传出呼叫

时间:2014-03-19 10:52:37

标签: android broadcastreceiver

有一种服务,其中处理过的媒体播放器希望为传入和传出呼叫服务停止的媒体播放器执行该操作,并且在呼叫流程结束时恢复播放。 现在只设法停止在传入和传出呼叫上播放,应该添加代码来播放TelephonyManager.CALL_STATE_IDLE:然后在音乐开始一段时间之后说话,如何解决?

public class CallReceiver extends BroadcastReceiver{
TelephonyManager telManager;
Context context;
boolean startedCall = false;

@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) {
    super.onCallStateChanged(state, incomingNumber);
    try {
        switch (state) {
        case TelephonyManager.CALL_STATE_RINGING: {
            if(incomingNumber!=null)
            {
                //incoming call
                MediaService.stopMP();
                startedCall  = true;
            }

        break;
        }
        case TelephonyManager.CALL_STATE_OFFHOOK: {
            if(incomingNumber!=null)
            {
                //outgoing call
                MediaService.stopMP();
                startedCall  = true;
            }

        break;
        }
        case TelephonyManager.CALL_STATE_IDLE: {
            if(startedCall)
            {
                MainActivity.titleMusic.setVisibility(View.VISIBLE);
                MainActivity.Play();
                MediaService.startMP();
                startedCall = false;
            }                   

        break;
        }
        default: { }
        }
        } catch (Exception ex) {

        }
    }
};
}

1 个答案:

答案 0 :(得分:2)

每当响铃之前,呼叫状态应该是TelephonyManager.CALL_STATE_IDLE,在接到来电之前,呼叫状态应该是IDEL,所以你必须设置一个标志布尔来识别状态;

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

    @Override
    public void onReceive(Context context, Intent intent) {    
       this.context=context;    
       private boolean startedCall = false; // New added boolean    
       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) {
    super.onCallStateChanged(state, incomingNumber);
    try {
        switch (state) {
            case TelephonyManager.CALL_STATE_RINGING: {
                if(incomingNumber!=null) {
                   //incoming call
                   MainActivity.stopMP()
                }    
                break;
            }
            case TelephonyManager.CALL_STATE_OFFHOOK: {    
                startedCall  = true; // Newly added code    
               if(incomingNumber!=null) {
                  //outgoing call
                   MainActivity.stopMP();
               }
               break;
            }
            case TelephonyManager.CALL_STATE_IDLE: {
               if(startedCall) {
                   MainActivity.titleMusic.setVisibility(View.VISIBLE);
                   MainActivity.Play();
                   MediaService.startMP();
               }          
               break;
            }
            default: { }
        }
      } catch (Exception ex) {

      }
    }
    };
}