Android 향상 의 TelephonyManager 기능 비밀 탐지

8855 단어 Android
앞의 글 은 JAVA 의 반사 체 제 를 사용 하여 블 루 투 스 의 숨겨 진 API 를 호출 하 는 방법 을 소개 하 였 으 며,본 고 는 JAVA 의 반사 체 제 를 계속 연습 하여 Telephony Manager 가 Framework 에 포함 되 어 있 지만 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 에 다음 두 줄 의 코드 를 추가 하여 권한 을 가 져 야 합 니 다.

<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);
 }
 }
}
관심 있 는 독 자 는 본 논문 의 인 스 턴 스 코드 를 테스트 하여 여러분 의 안 드 로 이 드 프로젝트 개발 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기