2011년 5월 21일 토요일

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

이번에는 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로 실행됩니다.


댓글 1개:

  1. 휴대폰을 usb로 연결해서 사용중입니다.
    휴대폰에서 5554로 전화를 걸었으나 계속해서 없는 번호라고 나옵니다 어떻게 해결하면 좋을까요?

    답글삭제

블록체인 개요 및 오픈소스 동향

블록체인(block chain) 블록체인은 공공 거래장부이며 가상 화폐로 거래할때 발생할때 발생할 수 있는 해킹을 막는 기술. 분산 데이터베이스의 한 형태로, 지속적으로 성장하는 데이터 기록 리스트로서 분산 노드의 운영자에 의한 임의 조작이 불가...