探秘TelephonyManager

探秘TelephonyManager

宁波达内】探秘TelephonyManager

       JAVA的反射机制,探秘TelephonyManager在Framework里包含却在SDK隐藏的几项功能。先来看看本文程序运行的效果图:
 

0_12918830843arn.gif


本文程序演示了以下功能:
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" />
达内android培训怎么样
main.xml源*如下:


<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 android:layout_height="wrap_content" 
                        android:layout_width="fill_parent" android:id="@+id/rbtnAutoReject"
                        android:text="所有来电自动挂断">
        
        <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 android:layout_height="wrap_content" 
                android:layout_width="fill_parent" android:id="@+id/tbtnDataConn"
                android:textSize="24dip" android:textStyle="normal" android:textOn="允许数据连接"
                android:textOff="禁止数据连接">

达内android培训

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().getdec*laredMethod("getITelephony");
                getITelephonyMethod.setAccessible(true);//私有化函数也能使用
                return (ITelephony)getITelephonyMethod.invoke(telMgr);
        }
        
        static public void printAllInform(Class clsShow) {  
            try {  
                // 取得所有方法  
                Method[] hideMethod = clsShow.getdec*laredMethods();  
                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();  
            }  
        }  
}
达内android培训
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 {
                                                //需要 
                                                PhoneUtils.getITele, phony(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);
                }
        }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值