본문 바로가기
오래된글/Articles

Android BroadcastReceiver을 이용한 전화 수신 Event Catch

by Records that rule memory 2018. 4. 19.
728x90

이번에는 Android Phone에서 전화 수신 Event을 받아서 특정 Activity를 실행시키는 방법을 살펴보도록 하겠습니다.


Step 1: Receiver Code, Callback Method onReceive


Phone 전화의 상태가 변경될때 Event을 수신하게 됩니다. onReceive Method가 자동 Callback되며 전화 상태를 정확히 파악하기 위해서는 PhoneStateListener를 등록해야 합니다.


public class ServiceReceiver extends BroadcastReceiver  {

...

@Override

public void onReceive(Context context, Intent intent) {

Log.i(TAG, "ServiceReceiver->onReceive();");

MyPhoneStateListener phoneListener = new MyPhoneStateListener();

TelephonyManager telephony = (TelephonyManager)

                             context.getSystemService(Context.TELEPHONY_SERVICE);

telephony.listen(phoneListener, PhoneStateListener.LISTEN_SERVICE_STATE);

telephony.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE);

Intent testActivityIntent = new Intent(context,CallCatcherActivity.class);

testActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

               testActivityIntent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);

               context.startActivity(testActivityIntent);

}


Intent를 사용할때는 Method 파라미터로 전달된 intent를 사용하지 말고 새로 선언해서 사용합니다.

그리고 Intent 옵션에 “Intent.FLAG_ACTIVITY_NEW_TASK”를 꼭 포함하여야지 오류가 발생하지 않습니다.


Step 2: PhoneStateListener Code, Callback Method onCallSateChanged


Receiver Code에서 등록되는 Evednt Listener입니다. 전화통화 상태가 변경될 때 호출되는 Callback Method입니다.


public class MyPhoneStateListener extends PhoneStateListener

...

@Override

public void onCallStateChanged(int state, String incomingNumber) {

switch (state) {

case TelephonyManager.CALL_STATE_IDLE:

Log.i(TAG,

"MyPhoneStateListener->onCallStateChanged() -> CALL_STATE_IDLE "

+ incomingNumber);

break;

case TelephonyManager.CALL_STATE_OFFHOOK:

Log.i(TAG,

"MyPhoneStateListener->onCallStateChanged() -> CALL_STATE_OFFHOOK "

+ incomingNumber);

break;

case TelephonyManager.CALL_STATE_RINGING:

Log.i(TAG,

"MyPhoneStateListener->onCallStateChanged() -> CALL_STATE_RINGING "

+ incomingNumber);

break;

default:

Log.i(TAG,

"MyPhoneStateListener->onCallStateChanged() -> default -> "

+ Integer.toString(state));

break;

}

}


Step 3: PhoneStateListener Code, Callback Method onServiceStateChanged


전화 서비스 상태가 변경될때 호출되는 Callback Method 입니다.


@Override

public void onServiceStateChanged(ServiceState serviceState) {

switch (serviceState.getState()) {

case ServiceState.STATE_IN_SERVICE:

Log.i(TAG,

"MyPhoneStateListener->onServiceStateChanged() -> STATE_IN_SERVICE");

serviceState.setState(ServiceState.STATE_IN_SERVICE);

break;

case ServiceState.STATE_OUT_OF_SERVICE:

Log.i(TAG,

"MyPhoneStateListener->onServiceStateChanged() -> STATE_OUT_OF_SERVICE");

serviceState.setState(ServiceState.STATE_OUT_OF_SERVICE);

break;

case ServiceState.STATE_EMERGENCY_ONLY:

Log.i(TAG,

"MyPhoneStateListener->onServiceStateChanged() -> STATE_EMERGENCY_ONLY");

serviceState.setState(ServiceState.STATE_EMERGENCY_ONLY);

break;

case ServiceState.STATE_POWER_OFF:

Log.i(TAG,

"MyPhoneStateListener->onServiceStateChanged() -> STATE_POWER_OFF");

serviceState.setState(ServiceState.STATE_POWER_OFF);

break;

default:

Log.i(TAG,

"MyPhoneStateListener->onServiceStateChanged() -> default -> "

+ Integer.toString(serviceState.getState()));

break;

}

}


Step 4: 아주 간단한 Activity

onReceiver Method에서 Activity를 정상 실행하는지 확인 할수 있는 간단한 UI가 포함된 Activity를 만들어줍니다. 저는 그냥 기본생성된것을 사용하였습니다...



Step 5: Android Manifest에 Receiver 등록


<receiver android:name=".ServiceReceiver">

<intent-filter>

<action android:name="android.intent.action.PHONE_STATE" />

</intent-filter>

</receiver>




Step 6: Android Manifest에 Permission 등록


전화기 상태를 접근하기 위해서는 아래 권한이 포함되어 있어야 합니다.


<uses-permission android:name="android.permission.READ_PHONE_STATE" />



Step 7: Test


AVD Emulator를 2개 띄우고 한쪽에 다른 한쪽으로 전화를 걸어봅니다. 전화번호는 어떻게 알까요? Emulator 좌측 상단에 “5554”,”5556”와 같은 숫자가 전화 번호 입니다.

전화를 거시면 본 예제”CallCatcher”가 실행되고 Android 기본 전화 Activity가 실행되면서 “CallCatcher”는 Background로 실행됩니다.

전화를 받게 되면 CallCatcher는 Foreground로 실행됩니다.



728x90