当前位置:操作系统 > 安卓/Android >>

Android提高第十四篇之探秘TelephonyManager

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

\

 

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

1.所有来电自动接听;

2.所有来电自动挂断;

3.开启/关闭Radio;

4.开启/关闭数据连接(WAP or NET的连接)。

调用TelephonyManager的隐藏API是先参考Framework的ase elephonyjavacomandroidinternal elephonyITelephony.aidl,然后自己实现一个ITelephony.aidl,最后在TelephonyManager中通过反射机制实例化自定义的ITelephony,实例化之后就可以调用ITelephony里面的函数了。

本文程序需要在AndroidManifest.xml添加以下两行代码,以获得权限:

view plaincopy to clipboardprint?
<uses-permission android:name="android.permission.CALL_PHONE" /> 
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" /> 
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />

main.xml源码如下:

view plaincopy to clipboardprint?
<?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> 
<?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并返回,源码如下:

view plaincopy to clipboardprint?
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

补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,