a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 系統(tǒng) > Android > 正文

Android提高之TelephonyManager功能探秘

2020-04-11 11:45:52
字體:
供稿:網(wǎng)友

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

先來看一下本文程序運行的效果圖,如下所示:

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

1.所有來電自動接聽;

2.所有來電自動掛斷;

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

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

調(diào)用TelephonyManager的隱藏API是先參考Framework的/base/telephony/java/com/android/internal/telephony/ITelephony.aidl,然后自己實現(xiàn)一個ITelephony.aidl,最后在TelephonyManager中通過反射機制實例化自定義的ITelephony,實例化之后就可以調(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="所有來電自動接聽"></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已經(jī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是手機功能類,從TelephonyManager中實例化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);//私有化函數(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是主類,使用PhoneStateListener監(jiān)聽通話狀態(tài),以及實現(xiàn)上述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開關(guān) ToggleButton tbtnDataConn;//數(shù)據(jù)連接的開關(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()); } } /** * 來電時的操作 * @author GV * */ public class CheckEvent implements RadioGroup.OnCheckedChangeListener{ @Override public void onCheckedChanged(RadioGroup group, int checkedId) {  testTelephony.this.checkedId=checkedId; } } /** * Radio和數(shù)據(jù)連接的開關(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)視電話狀態(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)//接聽  {  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); } }}

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 日韩精品一区二 | 国产日韩精品视频 | 免费观看一级黄色片 | 亚洲国产aⅴ成人精品无吗 91精品国产一区二区 | 日韩精品视频免费 | 亚洲码欧美码一区二区三区 | 浴室洗澡偷拍一区二区 | 久久久久久99精品 | 国产精品国产三级国产aⅴ无密码 | 久久精品久 | 日韩成人高清视频 | 久久亚洲视频 | 丰满少妇久久久久久久 | 午夜影院a | 中文字幕在线不卡 | 久草免费在线视频 | 97国产精品人人爽人人做 | 久草综合网 | 夜夜夜久久久 | 国产视频久久久 | 国产精品高潮呻吟久久久 | 天天爽天天干 | 国产精品毛片 | 国产中文在线播放 | 最新国产精品精品视频 | 欧美一级淫片免费看 | 久久久精品国产 | 国产在线视频网站 | 国产精品一区二区三区四区 | 日韩精品一区二 | 国产精品亚洲第一区在线暖暖韩国 | 三级网站 | 国产精品久久久久久久久久久久久 | 久久久www | 欧美一级片在线播放 | 国产成人黄色 | 五月婷婷在线观看视频 | 中文字幕av一区二区三区 | 久久99精品久久久久久国产越南 | 中国黄色一级毛片 | 欧美一区二区三区在线播放 |