티스토리 뷰

수신 및 발신 전화번호 알아내기

오늘은 수신 및 발신 전화번호를 알아내 보도록 하겠습니다.

1. 수신 전화번호 알아내기
  • 두가지 방법이 있습니다. 두가지 방법다 Manifest.xml에 다음의 permission이 등록되어 있어야 합니다.
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>


A. TelephonyManager 및 PhoneStateListener 이용하기
  • Activity나 Service에서 간단한 코드로 이를 알아 낼 수 있습니다.
  • 우선, onCreate() 에서 TelephonyManager를 얻어냅니다.
TelephonyManager telephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
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를 등록합니다.
       <receiver android:name="my.test.CallStateListener">
            <intent-filter>
                <action android:name="android.intent.action.PHONE_STATE"/>            </intent-filter>
        </receiver>
  • 이제 CallStateListener를 구현합니다.
public class CallStateListener extends BroadcastReceiver {
       
       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를 얻을 수 있습니다.
2. 발신 전화번호 알아내기
  • 발신번호는 TelephonyManager 및 PhoneStateListener를 이용해서는 얻을 수 없습니다.
  • 위의 B. 형태인 BroadcastReceiver를 이용해야 합니다.
  • Manifest.xml에 다음의 permission이 등록되어 있어야 합니다.
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>

  • 위에서 만들어 놓았던 BroadcastReceiver를 다시 이용합니다.
<receiver android:name="my.test.CallStateListener">
              <intent-filter>
                        <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>                         
                        <action android:name="android.intent.action.PHONE_STATE"/>             
              </intent-filter>
</receiver> 

  • 이제 CallStateListener에 구현합니다.
public class CallStateListener extends BroadcastReceiver {

      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가 바뀝니다.
  • 그리 어렵지는 않지요?


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함