설.현.아빠
Telephony [선율아빠]님 블로그 링크 본문
사용자용 다이얼러, 앱에서 전화 처리, 폰 상태 모니터링을 통합해 준다. 단 사용자의 통화중 in call 상태, 걸려오는 전화/발신 전화용 화면을 만들 수는 없다. 전화 걸기는 인텐트의 ACTION_CALL, ACTION_DIAL 액션이 최선의 예제이다. 모두 'tel: ' 스키마로 전화번호를 인텐트 데이터로 지정해 주어야 한다. Telephony api는 폰 상태, 수신 전화번호 검색, 통화 관리. TelephonyManager가 관리. 수신/발신 전화를 감지하고 이에 반응한다. ServiceState 객체로 서비스 변화 상태 감지 모바일 데이터 전송, 연결에 대해 모니터링 폰의 hw 접근은 SDK 1.x 이전에 삭제되었다. 향후 구현될 가능성에 대비해 가이드 수준으로 남겨둔다. Phone class: 하드웨어 설정 제어, 전화 제어, 걸고/끊고, 컨퍼런스 콜 처리 등 다양한 폰기능 인터페이스 Telephony
전화 걸기
startActivity(intent);폰 상태
폰의 상태 모니터링 골격
상태 읽기 권한을 요구,
PhoneStateListener phoneStateListener = new PhoneStateListener() {
public void onCallForwardingIndicatorChanged(boolean cfi) {} // 통화 전달.
public void onCallStateChanged(int state, String incomingNumber) {} // 통화상태(벨, 끊기)
public void onCellLocationChanged(CellLocation location) {} // 셀위치변경,
public void onDataActivity(int direction) {}
public void onDataConnectionStateChanged(int state) {} // 데이터 연결
public void onMessageWaitingIndicatorChanged(boolean mwi) {} // 대기
public void onServiceStateChanged(ServiceState serviceState) {} // 폰서비스변경,
public void onSignalStrengthChanged(int asu) {} // 모바일신호세기
};
// 모니터링 할 이벤트를 리스너에 등록한다.
telephonyManager.listen(phoneStateListener,
PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR |
PhoneStateListener.LISTEN_CALL_STATE |
PhoneStateListener.LISTEN_CELL_LOCATION |
PhoneStateListener.LISTEN_DATA_ACTIVITY |
PhoneStateListener.LISTEN_DATA_CONNECTION_STATE |
PhoneStateListener.LISTEN_MESSAGE_WAITING_INDICATOR |
PhoneStateListener.LISTEN_SERVICE_STATE |
PhoneStateListener.LISTEN_SIGNAL_STRENGTH);
// 리스너를 해제
telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE);전화 통화 모니터링
public void onCallStateChanged(int state, String incomingNumber) {// 전화 수신 반응.
case TelephonyManager.CALL_STATE_IDLE : break; // 폰이 울리거나 통화중이 아님.
case TelephonyManager.CALL_STATE_RINGING : break; // 폰이 울린다.
case TelephonyManager.CALL_STATE_OFFHOOK : break; // 폰이 현재 통화 중.
default: break;
}
telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE );
public void onCellLocationChanged(CellLocation location) {
GsmCellLocation gsmLocation = (GsmCellLocation)location;
Toast.makeText(getApplicationContext(), String.valueOf(gsmLocation.getCid()), Toast.LENGTH_LONG).show();
}
};셀 위치 추적
셀의 위치 변화 권한 요구
public void onCellLocationChanged(CellLocation location) {
GsmCellLocation gsmLocation = (GsmCellLocation)location;
Toast.makeText(getApplicationContext(), String.valueOf(gsmLocation.getCid()), Toast.LENGTH_LONG).show();
}
};서비스 변화 추적
public void onServiceStateChanged(ServiceState serviceState) {
if (serviceState.getState() == ServiceState.STATE_IN_SERVICE) {
String toastText = serviceState.getOperatorAlphaLong();
Toast.makeText(getApplicationContext(), toastText, Toast.LENGTH_SHORT);
}
}
};
telephonyManager.listen(serviceStateListener, PhoneStateListener.LISTEN_SERVICE_STATE);데이터 연결 및 활동 모니터링
public void onDataActivity(int direction) {
switch (direction) {
case TelephonyManager.DATA_ACTIVITY_IN : break;
case TelephonyManager.DATA_ACTIVITY_OUT : break;
case TelephonyManager.DATA_ACTIVITY_INOUT : break;
case TelephonyManager.DATA_ACTIVITY_NONE : break;
}
}
public void onDataConnectionStateChanged(int state) {
switch (state) {
case TelephonyManager.DATA_CONNECTED : break;
case TelephonyManager.DATA_CONNECTING : break;
case TelephonyManager.DATA_DISCONNECTED : break;
case TelephonyManager.DATA_SUSPENDED : break;
}
}
};
telephonyManager.listen(dataStateListener,
PhoneStateListener.LISTEN_DATA_ACTIVITY |
PhoneStateListener.LISTEN_DATA_CONNECTION_STATE);폰 속성 및 상태
String networkOperatorId = telephonyManager.getNetworkOperator();
String networkName = telephonyManager.getNetworkOperatorName();
int networkType = telephonyManager.getNetworkType();
String incomingCall = null;
if (telephonyManager.getCallState() == TelephonyManager.CALL_STATE_RINGING)
incomingCall = telephonyManager.getLine1Number();폰 제어하기
Phone 클래스 얻기