Notice
Recent Posts
Recent Comments
Link
관리 메뉴

설.현.아빠

Telephony [선율아빠]님 블로그 링크 본문

안드로이드/Telephony

Telephony [선율아빠]님 블로그 링크

설.현.아빠 2011. 2. 11. 11:36



Telephony

사용자용 다이얼러, 앱에서 전화 처리, 폰 상태 모니터링을 통합해 준다. 단 사용자의 통화중 in call 상태, 걸려오는 전화/발신 전화용 화면을 만들 수는 없다.

 

전화 걸기

전화 걸기는 인텐트의 ACTION_CALL, ACTION_DIAL 액션이 최선의 예제이다. 모두 'tel: ' 스키마로 전화번호를 인텐트 데이터로 지정해 주어야 한다.

 

  • Intent.ACTION_CALL : 자동으로 전화 걸고, 통화중 애플 표시, 네이티브 다이얼러를 대체하는 경우만 이용해야, 그 이외는  action-dial을 이용. 이 액션은 CALL_PHONE 권한을 부여 받아야 한다.
  • Intent.ACTION_DIAL 바로 전화를 걸지 않고, 다이얼러 시작 - 지정된 번호 전달.

 

  1. Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:1234567"));
            startActivity(intent);

 

폰 상태

Telephony api는 폰 상태, 수신 전화번호 검색, 통화 관리. TelephonyManager가 관리.

 

폰의 상태 모니터링 골격

 

상태 읽기 권한을 요구,
  1. <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>

 

  1.         TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
  2. // 리스너로 phone의 상태가 다른 컴포넌트로 알려진다.
  3. //
            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);

 

 

전화 통화 모니터링

수신/발신 전화를 감지하고 이에 반응한다.

  1. PhoneStateListener phoneStateListener = new PhoneStateListener() {
              public void onCallStateChanged(int state, String incomingNumber) {// 전화 수신 반응.
  2.                // 착신 전화 번호를 받는다.
  3.                 switch (state) {
                    case TelephonyManager.CALL_STATE_IDLE : break; // 폰이 울리거나 통화중이 아님.
                    case TelephonyManager.CALL_STATE_RINGING : break; // 폰이 울린다.
                    case TelephonyManager.CALL_STATE_OFFHOOK : break; // 폰이 현재 통화 중.
                    default: break;
                  }
  4.           }
  5. }
  6. // 모니터링 할 이벤트를 리스너에 등록한다.
    telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE );
  7.         PhoneStateListener cellLocationListener = new PhoneStateListener() {
              public void onCellLocationChanged(CellLocation location) {
                GsmCellLocation gsmLocation = (GsmCellLocation)location;
                Toast.makeText(getApplicationContext(), String.valueOf(gsmLocation.getCid()), Toast.LENGTH_LONG).show();
              }
            };

 

 

셀 위치 추적

 

 

셀의 위치 변화 권한 요구
  1. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>

 

  1. PhoneStateListener cellLocationListener = new PhoneStateListener() {
  2. // CellLocation: cell id(getCid)와 LAC(getLac()) 메서드 제공.
              public void onCellLocationChanged(CellLocation location) {
                GsmCellLocation gsmLocation = (GsmCellLocation)location;
                Toast.makeText(getApplicationContext(), String.valueOf(gsmLocation.getCid()), Toast.LENGTH_LONG).show();
              }
            };
  3. telephonyManager.listen(cellLocationListener, PhoneStateListener.LISTEN_CELL_LOCATION);

 

 

서비스 변화 추적

ServiceState 객체로 서비스 변화 상태 감지

  • ServiceState.STATE_IN_SERVICE : 일반적 폰 서비스
  • ServiceState.STATE_EMERGENCY_ONLY : 긴급 통화용
  • ServiceState.STATE_OUT_OF_SERVICE : 서비스 이용 불가
  • ServiceState.STATE_POWER_OFF : 폰 무선 장치가 꺼짐(비행모드에서 활성화된다)
  • getOperator*** 로 시작하는 메서드는 서비스 사업자에 대한 세부 정보를 얻는다.

 

  1. PhoneStateListener serviceStateListener = new PhoneStateListener() {
              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);

 

 

데이터 연결 및 활동 모니터링

모바일 데이터 전송, 연결에 대해 모니터링

 

  1. PhoneStateListener dataStateListener = new PhoneStateListener() {
              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);

 

 

폰 속성 및 상태

 

  1. // 사업자 정보.
  2.         String networkCountry = telephonyManager.getNetworkCountryIso();
            String networkOperatorId = telephonyManager.getNetworkOperator();
            String networkName = telephonyManager.getNetworkOperatorName();
            int networkType = telephonyManager.getNetworkType();

            String incomingCall = null;
  3. // 전화가 왔을 때 해당 전화 번호
            if (telephonyManager.getCallState() == TelephonyManager.CALL_STATE_RINGING)
                incomingCall = telephonyManager.getLine1Number();

 

 

 

폰 제어하기

폰의 hw 접근은 SDK 1.x 이전에 삭제되었다. 향후 구현될 가능성에 대비해 가이드 수준으로 남겨둔다.

 

Phone class: 하드웨어 설정 제어, 전화 제어, 걸고/끊고, 컨퍼런스 콜 처리 등 다양한 폰기능 인터페이스

Phone 클래스 얻기
  1. Phone phone = telephonyManager.getPhone();
  2. phone.dial()
  3. phone.call()
  4. phone.endCall()

 

  1. String badPrefix = "+234";
  2. PhoneStateListener dataStateListener = new PhoneStateListener() {
  3.     public void onCallStateChanged(int state, String incomingNumber) {
  4.     if(state == TelephonyManager.CALL_STATE_RINGING ) {
  5.         Phone phone = telephonyManager.getPhone();
  6.         if( incomingNumber.starsWith(badPrefix) ) {
  7.           phone.endCall();
  8.         }
  9. };

http://gtko.springnote.com/pages/5473335

Comments