亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android提高之TelephonyManager功能探秘

2020-04-11 11:45:52
字體:
來源:轉載
供稿:網友

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

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

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

1.所有來電自動接聽;

2.所有來電自動掛斷;

3.開啟/關閉Radio;

4.開啟/關閉數據連接(WAP or NET的連接)。

調用TelephonyManager的隱藏API是先參考Framework的/base/telephony/java/com/android/internal/telephony/ITelephony.aidl,然后自己實現一個ITelephony.aidl,最后在TelephonyManager中通過反射機制實例化自定義的ITelephony,實例化之后就可以調用ITelephony里面的函數了。

本文程序需要在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>

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);//私有化函數也能使用 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監聽通話狀態,以及實現上述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); } }}

感興趣的讀者可以測試一下本文實例代碼,希望能夠對大家的Android項目開發有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久亚洲福利精品午夜| 91在线网站视频| 一本色道久久88精品综合| 亚洲性生活视频在线观看| 中文字幕一精品亚洲无线一区| 91在线观看免费| 成人免费大片黄在线播放| 一区二区中文字幕| 久久精品视频亚洲| 色视频www在线播放国产成人| 亚洲成人免费在线视频| 亚洲欧美精品中文字幕在线| 欧美精品一区在线播放| 日韩高清不卡av| 欧美老妇交乱视频| 欧美激情喷水视频| 日韩在线免费视频观看| 色综合老司机第九色激情| 欧美成人午夜视频| 97精品久久久中文字幕免费| 国产精品一区二区三区毛片淫片| 中文字幕在线看视频国产欧美在线看完整| 亚洲国产精久久久久久| 欧美午夜电影在线| 国产男女猛烈无遮挡91| 深夜福利亚洲导航| 日韩精品极品毛片系列视频| 色综合男人天堂| www.亚洲一区| 亚洲国产精品人人爽夜夜爽| 国产精品嫩草影院久久久| 日韩av观看网址| 日本不卡高字幕在线2019| 欧美国产日韩中文字幕在线| 久久久久九九九九| 98精品国产高清在线xxxx天堂| 欧美剧在线观看| 精品久久中文字幕久久av| 成人免费直播live| 精品国产乱码久久久久久天美| 国产成+人+综合+亚洲欧美丁香花| 国产精品人成电影| 俺去啦;欧美日韩| 国产欧美日韩专区发布| 成人福利网站在线观看11| 日韩美女av在线| 午夜精品视频网站| 日韩中文字幕av| 久久精品免费电影| 精品中文字幕久久久久久| 91中文字幕在线| 国产精品久久久久久久天堂| 国产欧美最新羞羞视频在线观看| 久久九九亚洲综合| 国产婷婷成人久久av免费高清| 亚洲欧美国产日韩中文字幕| 成人在线中文字幕| 日韩电影大片中文字幕| 亚洲区一区二区| 国产成人精品久久| 日韩在线观看网址| 日韩美女av在线免费观看| 亚洲午夜av久久乱码| 成人欧美一区二区三区在线湿哒哒| 日韩福利伦理影院免费| 亚洲精品久久久久久久久久久久久| 伊人久久久久久久久久久久久| 韩剧1988在线观看免费完整版| 91人人爽人人爽人人精88v| 久久久免费电影| 午夜精品久久久久久久99热浪潮| 成人网址在线观看| 精品国产一区二区三区四区在线观看| 亚洲精品永久免费精品| 日本精品一区二区三区在线播放视频| 国产精品普通话| 国产精品一区电影| 欧美亚洲国产精品| 在线精品国产成人综合| 日韩电视剧在线观看免费网站| 亚洲xxxxx电影| 欧美黑人性生活视频| 91精品国产91久久久久福利| 美女久久久久久久| 国产区精品视频| 日韩精品视频在线观看免费| 国产精品视频资源| 亚洲国产精品久久91精品| 亚洲欧美日韩久久久久久| 91精品国产高清自在线| 成人a免费视频| 日本久久久久久| 亚洲一区二区福利| 亚洲国产成人久久| 国产成人av网| 日韩欧美中文免费| 久久久噜噜噜久噜久久| 国产美女主播一区| 97在线精品国自产拍中文| 91地址最新发布| 97精品国产97久久久久久春色| 国产精品xxx视频| 亚洲欧洲xxxx| 91久久久久久久久久久| 日韩福利伦理影院免费| 91精品国产综合久久香蕉| 在线电影av不卡网址| 午夜美女久久久久爽久久| 法国裸体一区二区| 国产欧美日韩丝袜精品一区| 亚洲最新av在线| 国产精品视频26uuu| 日韩欧美一区二区在线| 亚洲成人久久久| 国产不卡在线观看| 亚洲国产精品久久久久| 日本精品久久电影| 精品国内自产拍在线观看| 狠狠躁18三区二区一区| 7m精品福利视频导航| 成人观看高清在线观看免费| 一区二区三区四区在线观看视频| 国产精品久久久久999| 亚洲国产成人精品电影| 精品国产一区二区三区在线观看| 欧美激情亚洲另类| 亚洲最新av网址| 欧美激情精品久久久久久免费印度| 九九热这里只有精品免费看| 国产97色在线|日韩| 俺去亚洲欧洲欧美日韩| 国产精品成人免费电影| 91精品国产91久久久久久最新| 国产成人综合一区二区三区| 51精品国产黑色丝袜高跟鞋| 在线精品播放av| 国产成人啪精品视频免费网| 岛国av一区二区三区| 色婷婷亚洲mv天堂mv在影片| 亚洲丝袜在线视频| 久久久久久成人| 久久精品99久久久久久久久| 国产97色在线| 日韩在线视频线视频免费网站| 国产精品美女视频网站| 亚洲人午夜精品免费| 日韩精品亚洲元码| 国产精品欧美日韩一区二区| 国产精品电影久久久久电影网| 欧美日韩福利在线观看| 欧美日韩国产一区二区| 亚洲色图25p| 国产精品男女猛烈高潮激情| 亚洲天堂av综合网| 91影视免费在线观看| 亚洲成人网在线观看| 国产精品美女免费看| 一本大道久久加勒比香蕉| 91高清视频免费观看| 欧美孕妇与黑人孕交| 精品中文字幕久久久久久| 一区二区三区在线播放欧美| 欧美激情视频免费观看| 色综合天天狠天天透天天伊人|