'안드로이드전화수신'에 해당되는 글 1건

  1. 2020.11.20 전화 수신 감지 및 전화 온 번호 가져오기
Android2020. 11. 20. 14:32

 

 

 

전화 수신 감지 및 전화온 전화번호를 감지하는 코드이다.

브로드캐스트 리시버와, TelephonyManager 객체를 이용한다.

TelephonyManager 에서 PhoneStateListener 객체를 listen api에 달아주면 전화 상태를 감지할 수 있는데, 

전화옴, 전화받음, 통화 종료 등 통화 관련한 상태 감지가 된다.

추가로, 저장된 전화번호인 경우 저장된 이름을 가져오는 코드도 추가하였다.

참고로, 안드로이드에서는 주요 요소들을 내부적으로 DB로 관리하는데, 전화번호도 내부 DB에 들어있고

그리하여 Cursor를 이용해서 가져와야된다고 한다.

자원 낭비를 막아야하기 때문에 cursor.close()는 잊지 말것!

 

  public BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            switch (action) {
                case BluetoothAdapter.ACTION_STATE_CHANGED:
                //Do something
                break;
                case TelephonyManager.ACTION_PHONE_STATE_CHANGED:
                TelephonyManager telManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
                telManager.listen(new PhoneStateListener() {
                    public void onCallStateChanged(int state, String incomingNumber) {
                    if (state == TelephonyManager.CALL_STATE_RINGING) {
                        Log.e("test", "calling 전화번호 : " + incomingNumber);
                         //전화번호부를 긁어와서
                         Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(incomingNumber));
                         String[] projection = new String[]{ContactsContract.PhoneLookup.DISPLAY_NAME};
                         String displayName = "";
                         Cursor cursor = mContext.getContentResolver().query(uri, projection, null, null, null);
                         if (cursor != null) {
                             if (cursor.moveToFirst()) {
                                 //이름이 있으면 찾고
                                 displayName = cursor.getString(0);
                             }
                         }
                         cursor.close();
                         Log.e("test", "전화번호부에 저장된 이름 : " + displayName);
                    } else if (state == TelephonyManager.CALL_STATE_OFFHOOK) {
                        Log.e("test", "전화 받음 상태");
                    } else if (state == TelephonyManager.CALL_STATE_IDLE) {
                        Log.e("test", "통화 종료 상태");
                    }
                }, PhoneStateListener.LISTEN_CALL_STATE);
                break;

            }
        }
Posted by 사슴영혼'-'