Akashic Records

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

오래된글/Articles

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

Andrew's Akashic Records 2018. 4. 19. 14:32
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
Comments