`

Android提高第十四篇之探秘TelephonyManager

 
阅读更多

上次介绍了如何使用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添加以下两行代码,以获得权限: 

Xml代码  收藏代码
  1. <uses-permission android:name="android.permission.CALL_PHONE" />    
  2. <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />    

main.xml源码如下: 
Xml代码  收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>    
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    
  3.     android:orientation="vertical" android:layout_width="fill_parent"    
  4.     android:layout_height="fill_parent">    
  5.     <RadioGroup android:layout_height="wrap_content"    
  6.         android:layout_width="fill_parent" android:id="@+id/rGrpSelect">    
  7.         <RadioButton android:layout_height="wrap_content"    
  8.             android:layout_width="fill_parent" android:id="@+id/rbtnAutoAccept"    
  9.             android:text="所有来电自动接听"></RadioButton>    
  10.         <RadioButton android:layout_height="wrap_content"    
  11.             android:layout_width="fill_parent" android:id="@+id/rbtnAutoReject"    
  12.             android:text="所有来电自动挂断"></RadioButton>    
  13.     </RadioGroup>    
  14.     <ToggleButton android:layout_height="wrap_content"    
  15.         android:layout_width="fill_parent" android:id="@+id/tbtnRadioSwitch"    
  16.         android:textOn="Radio已经启动" android:textOff="Radio已经关闭"    
  17.         android:textSize="24dip" android:textStyle="normal"></ToggleButton>    
  18.     <ToggleButton android:layout_height="wrap_content"    
  19.         android:layout_width="fill_parent" android:id="@+id/tbtnDataConn"    
  20.         android:textSize="24dip" android:textStyle="normal" android:textOn="允许数据连接"    
  21.         android:textOff="禁止数据连接"></ToggleButton>    
  22. </LinearLayout>    

PhoneUtils.java是手机功能类,从TelephonyManager中实例化ITelephony并返回,源码如下: 
Java代码  收藏代码
  1. package com.testTelephony;    
  2.     
  3. import java.lang.reflect.Field;    
  4. import java.lang.reflect.Method;    
  5. import com.android.internal.telephony.ITelephony;    
  6. import android.telephony.TelephonyManager;    
  7. import android.util.Log;    
  8.     
  9. public class PhoneUtils {    
  10.     /**  
  11.      * 从TelephonyManager中实例化ITelephony,并返回  
  12.      */    
  13.     static public ITelephony getITelephony(TelephonyManager telMgr) throws Exception {    
  14.         Method getITelephonyMethod = telMgr.getClass().getDeclaredMethod("getITelephony");    
  15.         getITelephonyMethod.setAccessible(true);//私有化函数也能使用    
  16.         return (ITelephony)getITelephonyMethod.invoke(telMgr);    
  17.     }    
  18.         
  19.     static public void printAllInform(Class clsShow) {      
  20.         try {      
  21.             // 取得所有方法      
  22.             Method[] hideMethod = clsShow.getDeclaredMethods();      
  23.             int i = 0     
  24.             for (; i < hideMethod.length; i++) {      
  25.                 Log.e("method name", hideMethod[i].getName());      
  26.             }      
  27.             // 取得所有常量      
  28.             Field[] allFields = clsShow.getFields();      
  29.             for (i = 0; i < allFields.length; i++) {      
  30.                 Log.e("Field name", allFields[i].getName());      
  31.             }      
  32.         } catch (SecurityException e) {      
  33.             // throw new RuntimeException(e.getMessage());      
  34.             e.printStackTrace();      
  35.         } catch (IllegalArgumentException e) {      
  36.             // throw new RuntimeException(e.getMessage());      
  37.             e.printStackTrace();      
  38.         } catch (Exception e) {      
  39.             // TODO Auto-generated catch block      
  40.             e.printStackTrace();      
  41.         }      
  42.     }      
  43. }    

testTelephony.java是主类,使用PhoneStateListener监听通话状态,以及实现上述4种电话控制功能,源码如下: 
Java代码  收藏代码
  1. package com.testTelephony;    
  2.     
  3. import android.app.Activity;    
  4. import android.os.Bundle;    
  5. import android.telephony.PhoneStateListener;    
  6. import android.telephony.TelephonyManager;    
  7. import android.util.Log;    
  8. import android.view.View;    
  9. import android.widget.RadioGroup;    
  10. import android.widget.ToggleButton;    
  11.     
  12. public class testTelephony extends Activity {    
  13.     /** Called when the activity is first created. */    
  14.     RadioGroup rg;//来电操作单选框    
  15.     ToggleButton tbtnRadioSwitch;//Radio开关    
  16.     ToggleButton tbtnDataConn;//数据连接的开关    
  17.     TelephonyManager telMgr;    
  18.     CallStateListener stateListner;    
  19.     int checkedId=0;    
  20.     @Override    
  21.     public void onCreate(Bundle savedInstanceState) {    
  22.         super.onCreate(savedInstanceState);    
  23.         setContentView(R.layout.main);    
  24.             
  25.         telMgr= (TelephonyManager)getSystemService(TELEPHONY_SERVICE);    
  26.         telMgr.listen(new CallStateListener(), CallStateListener.LISTEN_CALL_STATE);    
  27.             
  28.         PhoneUtils.printAllInform(TelephonyManager.class);    
  29.             
  30.         rg = (RadioGroup)findViewById(R.id.rGrpSelect);    
  31.         rg.setOnCheckedChangeListener(new CheckEvent());    
  32.         tbtnRadioSwitch=(ToggleButton)this.findViewById(R.id.tbtnRadioSwitch);    
  33.         tbtnRadioSwitch.setOnClickListener(new ClickEvent());    
  34.         try {    
  35.             tbtnRadioSwitch.setChecked(PhoneUtils.getITelephony(telMgr).isRadioOn());    
  36.         }  catch (Exception e) {    
  37.             Log.e("error",e.getMessage());    
  38.         }    
  39.         tbtnDataConn=(ToggleButton)this.findViewById(R.id.tbtnDataConn);    
  40.         tbtnDataConn.setOnClickListener(new ClickEvent());    
  41.         try {    
  42.             tbtnDataConn.setChecked(PhoneUtils.getITelephony(telMgr).isDataConnectivityPossible());    
  43.         }  catch (Exception e) {    
  44.             Log.e("error",e.getMessage());    
  45.         }    
  46.     }    
  47.         
  48.     /**  
  49.      * 来电时的操作  
  50.      * @author GV  
  51.      *  
  52.      */    
  53.     public class CheckEvent implements RadioGroup.OnCheckedChangeListener{    
  54.     
  55.         @Override    
  56.         public void onCheckedChanged(RadioGroup group, int checkedId) {    
  57.             testTelephony.this.checkedId=checkedId;    
  58.         }    
  59.     }    
  60.         
  61.     /**  
  62.      * Radio和数据连接的开关  
  63.      * @author GV  
  64.      *  
  65.      */    
  66.     public class ClickEvent implements View.OnClickListener{    
  67.     
  68.         @Override    
  69.         public void onClick(View v) {    
  70.             if (v == tbtnRadioSwitch) {    
  71.                 try {    
  72.                     PhoneUtils.getITelephony(telMgr).setRadio(tbtnRadioSwitch.isChecked());    
  73.                 } catch (Exception e) {    
  74.                     Log.e("error", e.getMessage());    
  75.                 }    
  76.             }    
  77.             else if(v==tbtnDataConn){    
  78.                 try {    
  79.                     if(tbtnDataConn.isChecked())    
  80.                         PhoneUtils.getITelephony(telMgr).enableDataConnectivity();    
  81.                     else if(!tbtnDataConn.isChecked())    
  82.                         PhoneUtils.getITelephony(telMgr).disableDataConnectivity();    
  83.                 } catch (Exception e) {    
  84.                     Log.e("error", e.getMessage());    
  85.                 }       
  86.             }    
  87.         }    
  88.     }    
  89.         
  90.     /**  
  91.      * 监视电话状态  
  92.      * @author GV  
  93.      *  
  94.      */    
  95.     public class CallStateListener extends PhoneStateListener {    
  96.         @Override    
  97.         public void onCallStateChanged(int state, String incomingNumber) {    
  98.             if(state==TelephonyManager.CALL_STATE_IDLE)//挂断    
  99.             {    
  100.                 Log.e("IDLE",incomingNumber);    
  101.             }    
  102.             else if(state==TelephonyManager.CALL_STATE_OFFHOOK)//接听    
  103.             {    
  104.                 Log.e("OFFHOOK",incomingNumber);    
  105.             }    
  106.             else if(state==TelephonyManager.CALL_STATE_RINGING)//来电    
  107.             {    
  108.                 if(testTelephony.this.checkedId==R.id.rbtnAutoAccept)    
  109.                 {    
  110.                     try {    
  111.                         //需要<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />     
  112.                         PhoneUtils.getITelephony(telMgr).silenceRinger();//静铃    
  113.                         PhoneUtils.getITelephony(telMgr).answerRingingCall();//自动接听    
  114.                             
  115.                     } catch (Exception e) {    
  116.                         Log.e("error",e.getMessage());    
  117.                     }       
  118.                 }    
  119.                 else if(testTelephony.this.checkedId==R.id.rbtnAutoReject)    
  120.                 {    
  121.                     try {    
  122.                         PhoneUtils.getITelephony(telMgr).endCall();//挂断    
  123.                         PhoneUtils.getITelephony(telMgr).cancelMissedCallsNotification();//取消未接显示    
  124.                     } catch (Exception e) {    
  125.                         Log.e("error",e.getMessage());      
  126.                     }    
  127.                 }    
  128.             }    
  129.             super.onCallStateChanged(state, incomingNumber);    
  130.         }    
  131.     }    
  132. }    
分享到:
评论
1 楼 dagf113225 2012-01-29  
调用TelephonyManager的隐藏API是先参考Framework的\base\telephony\java\com\android\internal\telephony\ITelephony.aidl,然后自己实现一个ITelephony.aidl,最后在TelephonyManager中通过反射机制实例化自定义的ITelephony,实例化之后就可以调用ITelephony里面的函数了。

请指教,这步如何实现,能贴出完整的代码和工程吗?谢谢

相关推荐

    Android提高之TelephonyManager功能探秘

    前面文章介绍了如何使用JAVA的反射机制来调用蓝牙的隐藏API,本文继续来练习JAVA的反射机制,探秘TelephonyManager在Framework里包含却在SDK隐藏的几项功能。 先来看一下本文程序运行的效果图,如下所示: 本文程序...

    Android以TelephonyManager取得話機狀態

    本篇将深入探讨如何利用`TelephonyManager`来获取手机状态,并结合实践项目`PhoneState_Project`进行解析。 首先,我们需要了解`TelephonyManager`的基本用法。它位于`android.telephony`包下,可以通过`Context`的...

    Android(安卓)应用开发技术 TelephonyManager闹铃管理器的使用案例源代码.rar

    Android(安卓)应用开发技术 TelephonyManager闹铃管理器的使用案例源代码.rar Android(安卓)应用开发技术 TelephonyManager闹铃管理器的使用案例源代码.rar Android(安卓)应用开发技术 TelephonyManager闹铃...

    Android TelephonyManager详解及实现代码

    JAVA的反射机制,探秘TelephonyManager在Framework里包含却在SDK隐藏的几项功能。先来看看本文程序运行的效果图:  本文程序演示了以下功能:  1.所有来电自动接听;  2.所有来电自动挂断;  3.开启/关闭Radio...

    Android开发提高

    #### Android提高第十篇之AudioRecord实现“助听器” AudioRecord是Android提供的录音功能类,通过它,开发者可以实现实时声音捕捉,进而构建出诸如“助听器”这样的应用。这一技术不仅展示了Android平台的音频处理...

    Android之TelephonyManager类的方法详解

    TelephonyManager类主要提供了一系列用于访问与手机通讯相关的状态和信息的get方法。其中包括手机SIM的状态和信息、电信网络的状态及手机用户的信息。在应用程序中可以使用这些get方法获取相关数据。 ...

    Android中TelephonyManager用法实例

    在Android系统中,`TelephonyManager`是Android SDK提供的一个关键类,用于获取与电话通信相关的各种信息。这个类提供了许多方法,允许开发者访问手机的SIM卡状态、网络连接状态以及用户信息。在实际应用开发中,`...

    Android实现监听电话呼叫状态的方法

    在Android平台上,监听电话呼叫状态是一项重要的功能,它允许开发者获取到电话的实时状态,例如来电、通话中或挂断等。以下将详细介绍如何在Android应用中实现这一功能,包括必要的权限控制和电话状态监听。 首先,...

    Android应用源码之TelephonyManagerSample.zip

    在Android平台上,`TelephonyManager`是Android系统提供的一个关键接口,用于获取设备的电话功能信息。`TelephonyManagerSample.zip`很可能包含了一个示例项目,教导开发者如何使用`TelephonyManager` API来获取和...

    电话管理器(TelephonyManager)

    电话管理器(TelephonyManager)是Android系统中的一个重要组件,主要负责处理与手机通话功能相关的各种信息和操作。它提供了一系列API,使开发者能够获取到设备的电话状态、SIM卡信息以及网络连接等数据,从而在...

    TelephonyManager电话服务

    本篇文章将详细探讨`TelephonyManager`类的核心知识点,包括如何使用它来检测硬件支持、获取电话信息,以及处理各种电话状态。 1. 获取`TelephonyManager`实例: 要使用`TelephonyManager`,首先需要获取它的实例...

    android 监听来电和去电

    在Android开发中,监听来电和去电是许多应用程序的核心功能之一,尤其是在通讯应用、日志记录或企业级安全软件中。根据给定的文件信息,我们可以深入探讨如何在Android中实现这一功能,包括必要的权限设置、广播接收...

    Android中TelephonyManager类的方法实例分析

    Android中的`TelephonyManager`类是系统服务的一个关键组件,它提供了访问手机通信相关状态和信息的接口。开发者可以使用这个类来获取关于手机硬件、网络状态以及SIM卡等信息。在Android应用程序中,`...

    Android中TelephonyManager类的用法案例详解

    在Android开发中,TelephonyManager类是用于获取设备电话功能相关信息的重要工具。它提供了一系列方法,可以帮助开发者获取手机硬件信息,如IMEI、SIM卡信息、网络运营商等。本篇文章将详细讲解如何使用...

    android系统java反射机制详解

    Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查和操作类、接口、对象等的内部信息。在Android系统中,Java反射机制同样被广泛...理解并掌握反射机制,是成为高级Android开发者的关键技能之一。

    android判断网络状态、网络运营商、网络类型

    在Android开发中,掌握如何判断网络状态、获取网络运营商以及识别网络类型是非常关键的技能,这对于构建具有网络功能的应用程序至关重要。以下将详细介绍这些知识点。 首先,**判断网络状态**是确保应用程序能够...

Global site tag (gtag.js) - Google Analytics