[컴][안드로이드] 전화 올 때 음악이 재생되는 것을 멈추려면

how to detect incoming call / 전화올때 동작 / 전화올 때 멈추는 법


전화 오는 때에 service 의 동작을 멈추는 방법

기본적으로 Service 음악을 play 하거나 했을 때 전화가 와도 멈추지 않는다. 그냥 동시에 소리가 난다. 이러면 전화통화를 할 수 없으니, 전화가 올 때 Service 를 pause 하거나 stop 을 해야만 한다. 이럴 때

  • PhoneStateListener
  • BroadcastReceiver 

등의 방법을 사용할 수 있다.


PhoneStateListener

Detecting incoming and outgoing phone calls on Android.

PhoneStateListener 를 extends 해서 listener 를 만들고, TelephonyManager 에 listener를 설정 해 주면 된다.

private class CallStateListener extends PhoneStateListener {
  @Override
  public void onCallStateChanged(int state, String incomingNumber) {
      switch (state) {
          case TelephonyManager.CALL_STATE_RINGING:
          // called when someone is ringing to this phone
    
          Toast.makeText(ctx, 
                  "Incoming: "+incomingNumber, 
                  Toast.LENGTH_LONG).show();
          break;
      }
  }
 }

tm = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE);
tm.listen(callStateListener, PhoneStateListener.LISTEN_CALL_STATE);

listener 를 등록(register)하고,
나중에 필요없게 되면, unregister 한다.
tm.listen(callStateListener, PhoneStateListener.LISTEN_NONE);



BroadcastReceiver

http://stackoverflow.com/questions/14888995/android-closing-media-service-on-incoming-call


private void unregisterCallReceiver(){
    if(mIsReceiverRegistered){
        unregisterReceiver(mCallReceiver);
        mIsReceiverRegistered = false;
    }
}

private void registerCallReceiver(){
    if(!mIsReceiverRegistered){
        IntentFilter filter = new IntentFilter();
        filter.addAction("android.intent.action.PHONE_STATE");
        registerReceiver(mCallReceiver, filter);

        mIsReceiverRegistered = true;
    }


}
BroadcastReceiver mCallReceiver = new BroadcastReceiver(){

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

        String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
        String number = "";
        Bundle bundle = intent.getExtras();

        if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
            // Phone is ringing
            number = bundle.getString("incoming_number");
            pause();
            Log.d("CallStateReceiver", "pause is executed");

        } else if (state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {
            // Call received

        } else if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)) {
            // Call Dropped or rejected
        }



    }

}; // end of BroadcastReceiver



See Also


  1. Broadcast Receiver에 대해서| 안드로이드 기본 강좌, 2011.09.15.






댓글 없음:

댓글 쓰기