Android TelephonyManager詳解及實(shí)現(xiàn)代碼
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)限:
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="所有來(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);
}
}
}
以上就是Android TelephonyManager的介紹和簡(jiǎn)單示例,希望能幫助有需要的同學(xué),謝謝大家對(duì)本站的支持!
相關(guān)文章
Android采用File形式保存與讀取數(shù)據(jù)的方法
這篇文章主要介紹了Android采用File形式保存與讀取數(shù)據(jù)的方法,涉及Android文件流操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06
Android利用ZXing掃描二維碼的實(shí)例代碼解析
這篇文章主要介紹了Android利用ZXing掃描二維碼的實(shí)例解析,代碼簡(jiǎn)單易懂,非常不錯(cuò),需要的朋友可以參考下2016-12-12
Android開(kāi)發(fā)之電話(huà)撥號(hào)器實(shí)例詳解
這篇文章主要介紹了Android開(kāi)發(fā)之電話(huà)撥號(hào)器,結(jié)合實(shí)例形式詳細(xì)分析了Android電話(huà)撥號(hào)器的實(shí)現(xiàn)步驟與具體代碼,并附帶了一個(gè)Android開(kāi)放電話(huà)撥號(hào)器的學(xué)習(xí)筆記,需要的朋友可以參考下2015-12-12
Android編程設(shè)定activity進(jìn)入和退出效果的方法
這篇文章主要介紹了Android編程設(shè)定activity進(jìn)入和退出效果的方法,簡(jiǎn)單分析了Android Activity進(jìn)入與退出效果的實(shí)現(xiàn)原理及相關(guān)屬性設(shè)置技巧,需要的朋友可以參考下2017-07-07
Android編程實(shí)現(xiàn)手機(jī)自帶內(nèi)部存儲(chǔ)路徑的獲取方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)手機(jī)自帶內(nèi)部存儲(chǔ)路徑的獲取方法,涉及Android針對(duì)掛載點(diǎn)信息的獲取技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11
如何正確理解和使用Activity的4種啟動(dòng)模式
本文主要介紹了如何正確理解和使用Activity的4種啟動(dòng)模式。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-03-03
Android實(shí)現(xiàn)iPhone晃動(dòng)撤銷(xiāo)輸入功能 Android仿微信搖一搖功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)iPhone晃動(dòng)撤銷(xiāo)輸入功能,Android仿微信搖一搖功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
基于SceneForm實(shí)現(xiàn)子彈射擊(繪制子彈運(yùn)行軌跡)
這篇文章主要為大家詳細(xì)介紹了基于SceneForm實(shí)現(xiàn)子彈射擊,繪制子彈運(yùn)行軌跡,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11

