Android 实现自动接听和挂断电话功能

本文介绍如何在Android应用中通过权限管理和代码实现自动接听来电与控制数据连接的功能,包括设置权限、布局设计、类PhoneUtils的实现及主类testTelephony的电话控制功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[代码] [Java]代码

添加权限
<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);  
        }  
    }  
} 

4.6版(2015.3.26) 1、电话簿组件增加“删除手机联系人”命令; 2、应用操作类增加“取应用安装路径”命令; 3、短信组件“读取短信”“读取指定号码短信”命令的返回结果中增加“短信索引”信息; 4、短信组件增加“删除指定索引短信”命令,具体请参考《17、短信例程》(中级例程); 5、增加“拼音操作”类,用于将汉字词组转换成拼音; 6、手机组件增加“接听电话”、“挂断电话”、“取扬声器状态”、“打开扬声器”、“关闭扬声器”命令,具体请参考《51、手机例程》(中级例程); 7、录音器组件增加“设置录音源”命令,可用于在通话时设置双向录音; 8、增加万普支付组件(其他类组件),具体请参考《67、万普支付例程》(中级例程),另外由于有米支付已下线,故删除该组件; 9、增加短信验证组件(手机类组件),具体请参考《9905、短信验证例程》(中级例程); 10、高级例程增加《41、QQ空间登录与操作》例程,该源码来自E4A商业用户“阿蒙”; 11、中级例程增加《9906、高级列表框异步加载网络图片》例程; 12、中级例程增加《9907、ping测试》例程; 13、高级例程增加《42、WIFI串口调试》例程,该源码来自E4A商业用户“简单的幸福”; 14、方向传感器增加“取屏幕旋转角度”命令,所有可视组件增加“旋转特效”命令,具体用法请参考《9908、指南针例程》(中级例程); 15、中级例程增加《9909、自定义滑块条》例程,该源码来自E4A商业用户“孙大明”; 16、标签组件增加“置组件索引”、“取组件索引”、“绑定事件”命令; 17、删除高德地图组件中的弹出信息窗口上的小图标; 18、关于MySQL数据库操作中在APK被反编译后会暴露数据库账号密码的问题,大家可以把账号密码直接写到php中间件中,具体修改方法为:在openapi_unsafe.php文件中的第20行,把$mainbody[1]改成你的数据库用户名,$mainbody[2]改成你的数据库密码,然后把修改后的这个php中间件重新上传到你的服务器,最后在E4A中连接数据库的代码中,用户名密码填空文本即可; 19、修复Root权限操作类中“模拟点击”无效的问题,并增加“模拟移动”“模拟输入”命令,具体请参考《9910、模拟按键》例程(中级例程); 20、修复摄像框组件在横屏模式下预览图像会旋转90度的问题; 21、所有可视组件增加“清除焦点”命令; 22、面板、水平滚动框、垂直滚动框组件增加“添加组件”命令,可将窗口上已经设计好的组件添加到上面,而且会保持组件的相对坐标尺寸(面板请使用绝对布局方式); 23、活动栏组件增加“置背景图片”命令; 24、高级列表框组件增加“取项目消息数”“置项目消息数”命令,用于设置在项目图标的右上角显示新消息数量; 25、修正画板组件“被单击”事件无效的问题; 26、集合增加“打乱顺序”命令,可用于生成随机数组; 27、增加滑动面板组件(列表框类组件),可用于模拟手机QQ滑动菜单面板,具体请参考《9911、滑动面板例程》(中级例程); 2015.3.3 1、高级列表框组件增加“置进度条风格”、“置进度条颜色”、“取项目进度”、“置项目进度”命令; 2、画板组件增加“取文字宽度”“取文字高度”命令; 3、腾讯互联组件增加“取登录信息”“注销登录”命令; 4、修正高德地图组件在删除所有标记后方向定位标志也会被删除的问题; 5、下拉列表框组件增加“取项目标记”“置项目标记”命令; 6、增加“坐标转换”类,用于地球坐标、火星坐标、百度坐标之间的转换; 7、高德地图组件增加“置定位模式”、“画线条”命令; 8、网络操作类“取网络类型”增加对4G网络的判断; 9、滑动页面框组件增加“置现行页面”命令; 破解说明: 4月28号的更新包+破解补丁 请直接把破解补丁放到安装文件同个目录 首次使用请先在本地绑机里随意注册码注册一次
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值