알람기능이 들어간 앱을 만들경우에, 전화를 하고 있다면,

알람소리를 잠시 멈추었다가 통화가 끝나면 다시 재생해주는 등의 처리를 해주어야 합니다.

이러한 처리를 하기 위해서는 사용자가 전화를 받고 있다는 것을 알아야 하는데요.

이를 위해서 TelephonyManager와 PhoneStateListener가 필요한 데요.

오늘은 이들을 이용해서 대응하는 방법에 대해서 정리해 보도록 하겠습니다.



1. TelephonyManager


안드로이드 폰의 전화서비스에 대한 정보에 접근하기 위해서는 TelephonyManager객체가 필요한데요.
이를 위해서 getSystemService메소드를 통해서 객체의 레퍼런스를 얻어옵니다.


그리고 전화와 관련된 정보를 얻을 때는 Manifest에서 permission을 얻는다고 명시해주어야 하는데요

다행히 동적인 permission까지는 필요하지 않습니다.


이 TelephonyManager를 통해서 폰의 전화상태를 얻어올 수 있는데요.

getCallState() 메소드를 통해서 가능합니다.

잠시 이 메소드의 소스코드를 보고 가겠습니다.




전화상태에는 크게 세가지가 있다는 것을 알 수 있는데요.

  • CALL_STATE_IDLE
  • CALL_STATE_RINGING
  • CALL_STATE_OFFHOOK
IDLE이 아무행동도 없는 상태이구요.
RINGING이 전화가 오고 있는 상태, OFFHOOK는 전화를 걸거나, 전화중인 상태를 이야기합니다.

참고로 아래와 같이 초기값으로 전화상태를 얻어와서 저장해 놓은 다음, 추후에 이 값을 활용할 수도 있습니다.



2. PhoneStateListener


이제 위에서 얻은, 전화상태가 변화게 되었을 때, 그 정보를 얻어보도록 하겠습니다.

예상할 수 있듯이, listener를 사용해야 합니다.

여기서 사용하는 Listener가 PhoneStateListener인데요.


먼저 객체를 생성해주고, 원하는 상태의 변화를 듣게되면(listen하게 되면) 해주어야할 액션을, 

해당 상태를 나타내는 메소드에서 override해주면 됩니다.


저희는 전화를 하고 있는 상태인지를 듣고싶으므로, onCallStateChanged를 override 해주면 됩니다.


따라서  CALL_STATE_RINGING상태가 되었을 때,

mediaPlayer의 getCurrentPosition메소드를 위해 현재 위치를 저장한 다음,

CALL_STATE_IDLE에서, seekTo메소드를 통해서 멈춘지점으로 이동후에,

mediaPlayer.start()로 다시 재생해 주면 되는 것이겠지요.




3. 리스너 등록하기


이제 위에서 만든 PhoneStateListener를 등록해서 사용을 해야 할 텐데요.

아래와 같이 해주면 됩니다.



또한 이 리스너 등록을 해지해 주기 위해서는 아래와 같이 하면 되구요.




이렇게 해서, TelephonyManager와 PhoneStateListener 를 통해서 

전화 상태가 변경되었을 때 대응하는 방법에 대해서 정리해 보았습니다.





  1. useful keyborder 2017.06.27 12:39 신고

    방명록이 없으시네요. 아직 모바일 경력이 없는 저에게 많은 도움되네요. 이웃 추가 했습니다.

+ Recent posts