Android/기본스킬
안드로이드 TelephonyManager의 기능들
덩치
2014. 5. 21. 14:08
현재 단말기의 전화번호를 가져오고자 할때 사용한다.
((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).getLine1Number() |
그리고 아래는 단말기와 관련된 내용
|
그리고 아래는 좀 더 많은 내용.
분명 필요한 순간이 있을것이다. 잘 기억해두자.
=========================================================================================
android.telephony 패키지의 TelephonyManager클래스에서 담당한다.
단말기의 모뎀상태에 대한 정보를 얻기 위해서는 READ_PHONE_STATE권한이 필요하다.AndroidManifest.xml파일에 아래 내용을 추가한다. <uses-permission android:name="android.permission.READ_PHONE_STATE"> </uses-permission>
◆ 단말기의 모뎀상태 조회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());
◆ 조회결과getCallState :0(CALL_STATE_IDLE)getDataState :2(DATA_ACTIVITY_OUT)getDeviceId :000000000000000getDeviceSoftwareVersion :nullgetLine1Number :15555218135getNetworkCountryIso :usgetNetworkOperator :310260getNetworkOperatorName :AndroidgetNetworkType :3(NETWORK_TYPE_UMTS)getPhoneType :1(PHONE_TYPE_GSM)getSimCountryIso :usgetSimOperator :310260getSimOperatorName :AndroidgetSimSerialNumber :89014103211118510720getSimState :5(SIM_STATE_READY)getSubscriberId :310260000000000
실제상황에서는 이와같이 현재 단말기의 상태를 직접 조회하는것이 아니라 상태정보가 변경될 때 자동으로 인식해야하는 상황이 훨씬 많을것이다.이럴때는 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());그러나 역시 한국어로는 동작하지 않았다
그리고 아래는 좀 더 많은 내용.
분명 필요한 순간이 있을것이다. 잘 기억해두자.
=========================================================================================
android.telephony 패키지의 TelephonyManager클래스에서 담당한다.
단말기의 모뎀상태에 대한 정보를 얻기 위해서는 READ_PHONE_STATE권한이 필요하다.
AndroidManifest.xml파일에 아래 내용을 추가한다.
<uses-permission
android:name="android.permission.READ_PHONE_STATE">
</uses-permission>
◆ 단말기의 모뎀상태 조회
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());
◆ 조회결과
getCallState :0(CALL_STATE_IDLE)
getDataState :2(DATA_ACTIVITY_OUT)
getDeviceId :000000000000000
getDeviceSoftwareVersion :null
getLine1Number :15555218135
getNetworkCountryIso :us
getNetworkOperator :310260
getNetworkOperatorName :Android
getNetworkType :3(NETWORK_TYPE_UMTS)
getPhoneType :1(PHONE_TYPE_GSM)
getSimCountryIso :us
getSimOperator :310260
getSimOperatorName :Android
getSimSerialNumber :89014103211118510720
getSimState :5(SIM_STATE_READY)
getSubscriberId :310260000000000
실제상황에서는 이와같이 현재 단말기의 상태를 직접 조회하는것이 아니라
상태정보가 변경될 때 자동으로 인식해야하는 상황이 훨씬 많을것이다.
이럴때는 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());
그러나 역시 한국어로는 동작하지 않았다