欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android提高之TelephonyManager功能探秘

 更新時(shí)間:2014年08月09日 11:01:37   投稿:shichen2014  
這篇文章主要介紹了Android的TelephonyManager功能,可以幫助讀者更好的理解Java反射機(jī)制,需要的朋友可以參考下

前面文章介紹了如何使用JAVA的反射機(jī)制來(lái)調(diào)用藍(lán)牙的隱藏API,本文繼續(xù)來(lái)練習(xí)JAVA的反射機(jī)制,探秘TelephonyManager在Framework里包含卻在SDK隱藏的幾項(xiàng)功能。

先來(lái)看一下本文程序運(yùn)行的效果圖,如下所示:

本文程序演示了以下功能:

1.所有來(lái)電自動(dòng)接聽(tīng);

2.所有來(lái)電自動(dòng)掛斷;

3.開(kāi)啟/關(guān)閉Radio;

4.開(kāi)啟/關(guān)閉數(shù)據(jù)連接(WAP or NET的連接)。

調(diào)用TelephonyManager的隱藏API是先參考Framework的/base/telephony/java/com/android/internal/telephony/ITelephony.aidl,然后自己實(shí)現(xiàn)一個(gè)ITelephony.aidl,最后在TelephonyManager中通過(guò)反射機(jī)制實(shí)例化自定義的ITelephony,實(shí)例化之后就可以調(diào)用ITelephony里面的函數(shù)了。

本文程序需要在AndroidManifest.xml添加以下兩行代碼,以獲得權(quán)限:

<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="所有來(lái)電自動(dòng)接聽(tīng)"></RadioButton>
 <RadioButton android:layout_height="wrap_content"
  android:layout_width="fill_parent" android:id="@+id/rbtnAutoReject"
  android:text="所有來(lái)電自動(dòng)掛斷"></RadioButton>
 </RadioGroup>
 <ToggleButton android:layout_height="wrap_content"
 android:layout_width="fill_parent" android:id="@+id/tbtnRadioSwitch"
 android:textOn="Radio已經(jīng)啟動(dòng)" android:textOff="Radio已經(jīng)關(guān)閉"
 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="允許數(shù)據(jù)連接"
 android:textOff="禁止數(shù)據(jù)連接"></ToggleButton>
</LinearLayout>

PhoneUtils.java是手機(jī)功能類(lèi),從TelephonyManager中實(shí)例化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中實(shí)例化ITelephony,并返回
 */
 static public ITelephony getITelephony(TelephonyManager telMgr) throws Exception {
 Method getITelephonyMethod = telMgr.getClass().getDeclaredMethod("getITelephony");
 getITelephonyMethod.setAccessible(true);//私有化函數(shù)也能使用
 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.java是主類(lèi),使用PhoneStateListener監(jiān)聽(tīng)通話(huà)狀態(tài),以及實(shí)現(xiàn)上述4種電話(huà)控制功能,源碼如下:

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;//來(lái)電操作單選框
 ToggleButton tbtnRadioSwitch;//Radio開(kāi)關(guān)
 ToggleButton tbtnDataConn;//數(shù)據(jù)連接的開(kāi)關(guān)
 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());
 }
 }
 /**
 * 來(lái)電時(shí)的操作
 * @author GV
 *
 */
 public class CheckEvent implements RadioGroup.OnCheckedChangeListener{

 @Override
 public void onCheckedChanged(RadioGroup group, int checkedId) {
  testTelephony.this.checkedId=checkedId;
 }
 }
 /**
 * Radio和數(shù)據(jù)連接的開(kāi)關(guān)
 * @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());
  } 
  }
 }
 }
 /**
 * 監(jiān)視電話(huà)狀態(tài)
 * @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)//接聽(tīng)
  {
  Log.e("OFFHOOK",incomingNumber);
  }
  else if(state==TelephonyManager.CALL_STATE_RINGING)//來(lái)電
  {
  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();//自動(dòng)接聽(tīng)
     
   } 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);
 }
 }
}

感興趣的讀者可以測(cè)試一下本文實(shí)例代碼,希望能夠?qū)Υ蠹业腁ndroid項(xiàng)目開(kāi)發(fā)有所幫助。

相關(guān)文章

最新評(píng)論