1. 수신 전화번호 알아내기
- 두가지 방법이 있습니다. 두가지 방법다 Manifest.xml에 다음의 permission이 등록되어 있어야 합니다.
A. TelephonyManager 및 PhoneStateListener 이용하기
- Activity나 Service에서 간단한 코드로 이를 알아 낼 수 있습니다.
- 우선, onCreate() 에서 TelephonyManager를 얻어냅니다.
TelephonyManager telephonyMgr.listen(new PhoneStateListener(){
public void onCallStateChanged(int state, String incommingNumber){
switch(state) {
case TelephonyManager.CALL_STATE_RINGING:
Log.d(TAG, " CALL_STATE_RINGING.:" + incommingNumber);
break;
case TelephonyManager.CALL_STATE_IDLE:
Log.d(TAG,"CALL_STATE_IDLE ");
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
Log.d(TAG,"CALL_STATE_OFFHOOK ");
break;
}
}
}, PhoneStateListener.LISTEN_CALL_STATE);
- PhoneStateListener는 Class 형태 이므로, onCallStateChanged()를 override하시면 됩니다.
- incommingNumber안에 String형태로 넘어오기에 구현하기는 너무 간단합니다.
B. BroadcastReceiver 이용하기
- Manifest.xml에 BroadcastReceiver를 등록합니다.
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE"/> </intent-filter>
</receiver>
- 이제 CallStateListener를 구현합니다.
public String TAG = getClass().getSimpleName();
@Override
public void onReceive(Context context, Intent received) {
String action = received.getAction();
Bundle bundle = received.getExtras();
if(action.equals("android.intent.action.PHONE_STATE")){
String state = bundle.getString(TelephonyManager.EXTRA_STATE);
if(state.equals(TelephonyManager.EXTRA_STATE_IDLE)){
Log.d(TAG, " EXTRA_STATE_IDLE ");
}else if(state.equals(TelephonyManager.EXTRA_STATE_RINGING)){
Log.d(TAG, " EXTRA_STATE_RINGING INCOMMING NUMBER : " + bundle.getString(TelephonyManager.EXTRA_INCOMING_NUMBER));
}else if(state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){
Log.d(TAG, " EXTRA_STATE_OFFHOOK ");
}
}
}
}
- 실제 폰을 가지고 위 코드를 실행해 보시면
- RINGING -> OFFHOOK -> IDLE 순으로 status가 변하는 것을 볼 수 있으며, RINGING 에서만 number를 얻을 수 있습니다.
- 발신번호는 TelephonyManager 및 PhoneStateListener를 이용해서는 얻을 수 없습니다.
- 위의 B. 형태인 BroadcastReceiver를 이용해야 합니다.
- Manifest.xml에 다음의 permission이 등록되어 있어야 합니다.
- 위에서 만들어 놓았던 BroadcastReceiver를 다시 이용합니다.
<intent-filter>
<action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
<action android:name="android.intent.action.PHONE_STATE"/>
</intent-filter>
</receiver>
- 이제 CallStateListener에 구현합니다.
public String TAG = getClass().getSimpleName();
@Override
public void onReceive(Context context, Intent received) {
String action = received.getAction();
Bundle bundle = received.getExtras();
if(action.equals("android.intent.action.PHONE_STATE")){
String state = bundle.getString(TelephonyManager.EXTRA_STATE);
if(state.equals(TelephonyManager.EXTRA_STATE_IDLE)){
Log.d(TAG, " EXTRA_STATE_IDLE ");
}else if(state.equals(TelephonyManager.EXTRA_STATE_RINGING)){
Log.d(TAG, " EXTRA_STATE_RINGING INCOMMING NUMBER : " + bundle.getString(TelephonyManager.EXTRA_INCOMING_NUMBER));
}else if(state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){
Log.d(TAG, " EXTRA_STATE_OFFHOOK ");
}
}else if(action.equals(Intent.ACTION_NEW_OUTGOING_CALL)){
Log.d(TAG, " OUTGOING CALL : " + bundle.getString(Intent.EXTRA_PHONE_NUMBER));
}
}
}
- 빨간색으로 표시된 부분입니다.
- 위 로그를 보자면 OUTGOING_CALL -> OFFHOOK -> IDLE 의 순서로 status가 바뀝니다.
- 그리 어렵지는 않지요?