1. AndroidManifest.xml 에 아래 권한 추가 <uses-permission android:name="android.permission.READ_PHONE_STATE" />
2. 아래와 같이 Context.getSystemService 를 통해 TelephonyManager 를 가져옴. TelephonyManager telephony = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
3. TelephonyManager 의 메소드 들 중, getLine1Number() 메소드가 전화번호를 반환 String telPhoneNo = telephony.getLine1Number(); 출처 ( http://icess.egloos.com/3279459 )
android.telephony 패키지의 TelephonyManager클래스에서 담당한다.
단말기의 모뎀상태에 대한 정보를 얻기 위해서는 READ_PHONE_STATE권한이 필요하다. AndroidManifest.xml파일에 아래 내용을 추가한다. <uses-permission android:name="android.permission.READ_PHONE_STATE" />
◆ 단말기의 모뎀상태 조회 TelephonyManager 객체를 얻기 위해서는 Context 객체에서 제공하는 getSystemService() 메서드를 이용한다. TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
음성통화 상태 조회 CALL_STATE_IDLE/CALL_STATE_OFFHOOK/CALL_STATE_RINGING 등의 값을 반환 Log.d("PHONE", "getCallState :" + tm.getCallState()); 데이터통신 상태 조회 DATA_DISCONNECTED/DATA_CONNECTING/DATA_CONNECTED/DATA_SUSPENDED 등의 값을 반환 Log.d("PHONE", "getDataState :" + tm.getDataState()); 단말기 ID 조회 GSM방식의 IMEI 또는 CDMA방식의 MEID 값을 반환 Log.d("PHONE", "getDeviceId :" + tm.getDeviceId()); SW버전 조회 GSM방식의 IMEI/SV와 같은 SW버전을 반환 Log.d("PHONE", "getDeviceSoftwareVersion :" + tm.getDeviceSoftwareVersion()); 전화번호 조회 GSM방식의 MSISDN과 같은 전화번호 반환 Log.d("PHONE", "getLine1Number :" + tm.getLine1Number()); 국가코드 조회 현재 등록된 망 사업자의 MCC(Mobile Country Code)에 대한 ISO 국가코드 반환 Log.d("PHONE", "getNETWORKCountryIso :" + tm.getNetworkCountryIso()); Log.d("PHONE", "getSimCountryIso :" + tm.getSimCountryIso()); 망 사업자코드 조회 현재 등록된 망 사업자의 MCC+MNC(Mobile Network Code) 반환 Log.d("PHONE", "getNetworkOperator :" + tm.getNetworkOperator()); Log.d("PHONE", "getSimOperator :" + tm.getSimOperator()); 망 사업자명 조회 현재 등록된 망 사업자명 반환 Log.d("PHONE", "getNetworkOperatorName :" + tm.getNetworkOperatorName()); Log.d("PHONE", "getSimOperatorName :" + tm.getSimOperatorName()); 망 시스템 방식 조회 현재 단말기에서 사용중인 망 시스템 방식을 반환 NETWORK_TYPE_UNKNOWN/ GSM방식 : NETWORK_TYPE_GPRS/NETWORK_TYPE_EDGE/NETWORK_TYPE_UMTS/ NETWORK_TYPE_HSDPA/NETWORK_TYPE_HSUPA/NETWORK_TYPE_HSPA CDMA방식 : NETWORK_TYPE_CDMA/NETWORK_TYPE_EVDO_0/NETWORK_TYPE_EVDO_A/NETWORK_TYPE_1xRTT Log.d("PHONE", "getNetworkType :" + tm.getNetworkType()); 단말기 종류 조회 단말기에서 지원하는 망의 종류를 반환 PHONE_TYPE_NONE/PHONE_TYPE_GSM/PHONE_TYPE_CDMA 등의 값을 반환 Log.d("PHONE", "getPhoneType :" + tm.getPhoneType()); SIM카드 Serial Number 조회 Log.d("PHONE", "getSimSerialNumber :" + tm.getSimSerialNumber()); SIM카드 상태 조회 SIM_STATE_UNKNOWN/SIM_STATE_ABSENT/SIM_STATE_PIN_REQUIRED/SIM_STATE_PUK_REQUIRED/ SIM_STATE_NETWORK_LOCKED/SIM_STATE_READY 등의 값을 반환 Log.d("PHONE", "getSimState :" + tm.getSimState()); 가입자 ID 조회 GSM방식의 IMSI와 같은 가입자 ID 반환 Log.d("PHONE", "getSubscriberId :" + tm.getSubscriberId());
실제상황에서는 이와같이 현재 단말기의 상태를 직접 조회하는것이 아니라 상태정보가 변경될 때 자동으로 인식해야하는 상황이 훨씬 많을것이다. 이럴때는 TelephonyManager의 listen()를 이용하여 콜백메서드를 등록하면 가능하다. tm.listen(new PhoneStateListener(){ public void onCallStateChanged(int state, String incomingNumber){ if (state == TelephonyManager.CALL_STATE_RINGING){ Log.d("Telephony", "state = " + state + ", number = " + incomingNumber); }else{ Log.d("Telephony", "state = " + state); } } }, PhoneStateListener.LISTEN_CALL_STATE);
onCallStateChanged() 이외에도 아래와 같은 상태변화를 감지할 수 있다. - onCallForwardingIndicatorChanged() : 호전환(Call Forwarding) 상태 변화 - onCellLocationChanged() : 단말기의 Cell위치 변화 - onDataActivity() : Data 활성화 상태 변화 - onDataConnectionStateChanged() : Data 연결상태 변화 - onMessageWaitingIndicatorChanged() : 메시지 대기상태 변화 - onServiceStateChanged() : 단말기의 서비스 상태 변화 - onSignalStrengthsChanged() : 망의 신호강도 변화
◆ 전화번호 처리 각 국가별로 전화번호의 형식이 다르다. 한국은 01x-xxxx-xxxx 이 일반적이고, 북미는 xxx-xxx-xxxx가 된다. PhoneNumberUtils.formatNumber() 메서드를 사용하면 설정된 Locale에 맞게 형식화 된다. String formattedTelNumber = PhoneNumberUtils.formatNumber("01098761234"); Log.d("Telephony", "formattedTelNumber :" + formattedTelNumber); Locale을 English(United States)로 할경우 010-987-61234로 출력된다. 한국어로 할 경우는 01098761234가 그대로 출력된다. formatNumber() 메서드의 구현내용을 살펴봐야 할듯 하다.
EditText에서 전화번호를 입력받을 경우에도 자동으로 형식화가 가능하다. EditText객체의 addTextChangedListener에 PhoneNumberFormattingTextWatcher()를 등록하기만 하면 된다. EditText tn = (EditText) findViewById(R.id.edtTelNumber); tn.addTextChangedListener(new PhoneNumberFormattingTextWatcher()); 그러나 역시 한국어로는 동작하지 않았다.