zoukankan      html  css  js  c++  java
  • Android 实现自动接听和挂断电话功能

    添加权限
    <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"  
        androidrientation="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.getName());    
                }    
                // 取得所有常量    
                Field[] allFields = clsShow.getFields();    
                for (i = 0; i < allFields.length; i++) {    
                    Log.e("Field name", allFields.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);  
            }  
        }  
    } 
  • 相关阅读:
    Linux 服务器 个人常用操作命令记录
    Thinkphp5.0 自定义命令command的使用
    vue初学之node.js安装、cnpm安装、vue初体验
    php实现在不同国家显示网站的不同语言版本
    array_map、array_walk、array_filter三个函数的区别
    实现简单点赞功能
    SQL语言-----数据操作
    SQL语言
    MySQL高可用架构之Keepalived+主从架构部署
    MyCAT源码分析——分析环境部署
  • 原文地址:https://www.cnblogs.com/xiaochao1234/p/3952832.html
Copyright © 2011-2022 走看看