Android TelephonyManager 상세 설명 및 구현 코드

JAVA 의 반사 메커니즘,비밀 탐지 Telephony Manager 는 프레임 워 크 에 SDK 에 숨겨 진 몇 가지 기능 을 포함 하고 있 습 니 다.먼저 본 프로그램의 실행 효과 도 를 살 펴 보 자.

  본 고 는 다음 과 같은 기능 을 보 여 주 었 다.
       1.모든 전 화 는 자동 으로 받는다.
       2.모든 전화 가 자동 으로 끊 긴 다.
       3.라디오 를 켜 거나 끄 기;
       4.데이터 연결(WAP or NET 연결)을 켜 거나 끕 니 다.
       Telephony Manager 의 숨겨 진 API 를 호출 하 는 것 은 먼저 Framework 의/base/telephony/java/com/android/internal/telephony/ITErephony.aidl 을 참고 한 다음 에 스스로 ITErephony.aidl 을 실현 하 는 것 입 니 다.마지막 으로 Telephony Manager 에서 반사 체 제 를 통 해 사용자 정의 ITErephony 를 실례 화 한 후에 ITErephony 안의 함 수 를 호출 할 수 있 습 니 다.
       이 프로그램 은 AndroidManifest.xml 에 다음 두 줄 의 코드 를 추가 하여 권한 을 가 져 야 합 니 다.
XML/HTML 코드:

<uses-permission android:name="android.permission.CALL_PHONE" /> 
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" /> 
  main.xml 원본 코드 는 다음 과 같 습 니 다.

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  android:orientation="vertical" android:layout_width="fill_parent" 
  android:layout_height="fill_parent"> 
  <RadioGroup android:layout_height="wrap_content" 
    android:layout_width="fill_parent" android:id="@+id/rGrpSelect"> 
    <RadioButton android:layout_height="wrap_content" 
      android:layout_width="fill_parent" android:id="@+id/rbtnAutoAccept" 
      android:text="        "></RadioButton> 
    <RadioButton android:layout_height="wrap_content" 
      android:layout_width="fill_parent" android:id="@+id/rbtnAutoReject" 
      android:text="        "></RadioButton> 
  </RadioGroup> 
  <ToggleButton android:layout_height="wrap_content" 
    android:layout_width="fill_parent" android:id="@+id/tbtnRadioSwitch" 
    android:textOn="Radio    " android:textOff="Radio    " 
    android:textSize="24dip" android:textStyle="normal"></ToggleButton> 
  <ToggleButton android:layout_height="wrap_content" 
    android:layout_width="fill_parent" android:id="@+id/tbtnDataConn" 
    android:textSize="24dip" android:textStyle="normal" android:textOn="      " 
    android:textOff="      "></ToggleButton> 
</LinearLayout> 
 Phone Utils.java 는 핸드폰 기능 류 로 Telephony Manager 에서 ITelephony 를 실례 화하 고 되 돌려 줍 니 다.원본 코드 는 다음 과 같 습 니 다.

package com.testTelephony; 
 
import java.lang.reflect.Field; 
import java.lang.reflect.Method; 
import com.android.internal.telephony.ITelephony; 
import android.telephony.TelephonyManager; 
import android.util.Log; 
 
public class PhoneUtils { 
  /** 
   *  TelephonyManager    ITelephony,    
   */ 
  static public ITelephony getITelephony(TelephonyManager telMgr) throws Exception { 
    Method getITelephonyMethod = telMgr.getClass().getDeclaredMethod("getITelephony"); 
    getITelephonyMethod.setAccessible(true);//          
    return (ITelephony)getITelephonyMethod.invoke(telMgr); 
  } 
   
  static public void printAllInform(Class clsShow) {  
    try {  
      //         
      Method[] hideMethod = clsShow.getDeclaredMethods();  
      int i = 0;  
      for (; i < hideMethod.length; i++) {  
        Log.e("method name", hideMethod[i].getName());  
      }  
      //         
      Field[] allFields = clsShow.getFields();  
      for (i = 0; i < allFields.length; i++) {  
        Log.e("Field name", allFields[i].getName());  
      }  
    } catch (SecurityException e) {  
      // throw new RuntimeException(e.getMessage());  
      e.printStackTrace();  
    } catch (IllegalArgumentException e) {  
      // throw new RuntimeException(e.getMessage());  
      e.printStackTrace();  
    } catch (Exception e) {  
      // TODO Auto-generated catch block  
      e.printStackTrace();  
    }  
  }  
} 
testTelephony.자바 는 주요 유형 으로 Phone State Listener 를 사용 하여 통화 상 태 를 감청 하고 상기 4 가지 전화 제어 기능 을 실현 하 며 소스 코드 는 다음 과 같다.

package com.testTelephony; 
 
import android.app.Activity; 
import android.os.Bundle; 
import android.telephony.PhoneStateListener; 
import android.telephony.TelephonyManager; 
import android.util.Log; 
import android.view.View; 
import android.widget.RadioGroup; 
import android.widget.ToggleButton; 
 
public class testTelephony extends Activity { 
  /** Called when the activity is first created. */ 
  RadioGroup rg;//        
  ToggleButton tbtnRadioSwitch;//Radio   
  ToggleButton tbtnDataConn;//        
  TelephonyManager telMgr; 
  CallStateListener stateListner; 
  int checkedId=0; 
  @Override 
  public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
     
    telMgr= (TelephonyManager)getSystemService(TELEPHONY_SERVICE); 
    telMgr.listen(new CallStateListener(), CallStateListener.LISTEN_CALL_STATE); 
     
    PhoneUtils.printAllInform(TelephonyManager.class); 
     
    rg = (RadioGroup)findViewById(R.id.rGrpSelect); 
    rg.setOnCheckedChangeListener(new CheckEvent()); 
    tbtnRadioSwitch=(ToggleButton)this.findViewById(R.id.tbtnRadioSwitch); 
    tbtnRadioSwitch.setOnClickListener(new ClickEvent()); 
    try { 
      tbtnRadioSwitch.setChecked(PhoneUtils.getITelephony(telMgr).isRadioOn()); 
    } catch (Exception e) { 
      Log.e("error",e.getMessage()); 
    } 
    tbtnDataConn=(ToggleButton)this.findViewById(R.id.tbtnDataConn); 
    tbtnDataConn.setOnClickListener(new ClickEvent()); 
    try { 
      tbtnDataConn.setChecked(PhoneUtils.getITelephony(telMgr).isDataConnectivityPossible()); 
    } catch (Exception e) { 
      Log.e("error",e.getMessage()); 
    } 
  } 
   
  /** 
   *        
   * @author GV 
   * 
   */ 
  public class CheckEvent implements RadioGroup.OnCheckedChangeListener{ 
 
    @Override 
    public void onCheckedChanged(RadioGroup group, int checkedId) { 
      testTelephony.this.checkedId=checkedId; 
    } 
  } 
   
  /** 
   * Radio         
   * @author GV 
   * 
   */ 
  public class ClickEvent implements View.OnClickListener{ 
 
    @Override 
    public void onClick(View v) { 
      if (v == tbtnRadioSwitch) { 
        try { 
          PhoneUtils.getITelephony(telMgr).setRadio(tbtnRadioSwitch.isChecked()); 
        } catch (Exception e) { 
          Log.e("error", e.getMessage()); 
        } 
      } 
      else if(v==tbtnDataConn){ 
        try { 
          if(tbtnDataConn.isChecked()) 
            PhoneUtils.getITelephony(telMgr).enableDataConnectivity(); 
          else if(!tbtnDataConn.isChecked()) 
            PhoneUtils.getITelephony(telMgr).disableDataConnectivity(); 
        } catch (Exception e) { 
          Log.e("error", e.getMessage()); 
        }   
      } 
    } 
  } 
   
  /** 
   *        
   * @author GV 
   * 
   */ 
  public class CallStateListener extends PhoneStateListener { 
    @Override 
    public void onCallStateChanged(int state, String incomingNumber) { 
      if(state==TelephonyManager.CALL_STATE_IDLE)//   
      { 
        Log.e("IDLE",incomingNumber); 
      } 
      else if(state==TelephonyManager.CALL_STATE_OFFHOOK)//   
      { 
        Log.e("OFFHOOK",incomingNumber); 
      } 
      else if(state==TelephonyManager.CALL_STATE_RINGING)//   
      { 
        if(testTelephony.this.checkedId==R.id.rbtnAutoAccept) 
        { 
          try { 
            //  <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />  
            PhoneUtils.getITelephony(telMgr).silenceRinger();//   
            PhoneUtils.getITelephony(telMgr).answerRingingCall();//     
             
          } catch (Exception e) { 
            Log.e("error",e.getMessage()); 
          }   
        } 
        else if(testTelephony.this.checkedId==R.id.rbtnAutoReject) 
        { 
          try { 
            PhoneUtils.getITelephony(telMgr).endCall();//   
            PhoneUtils.getITelephony(telMgr).cancelMissedCallsNotification();//       
          } catch (Exception e) { 
            Log.e("error",e.getMessage());  
          } 
        } 
      } 
      super.onCallStateChanged(state, incomingNumber); 
    } 
  } 
} 
이상 은 안 드 로 이 드 Telephony Manager 의 소개 와 간단 한 예 입 니 다.필요 한 학생 들 을 도 울 수 있 기 를 바 랍 니 다.본 사이트 에 대한 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기