AIDL自动挂断电话

该业务是属于跨进程的数据获取

所需权限

<!--     打电话权限 -->
<uses-permission android:name="android.permission.CALL_PHONE"/>
<!-- 监听电话权限   -->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<!-- 处理呼出电话权限,用于修改呼出的电话号码    -->
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>

1、建一个新的包,包名为

com.android.internal.telephony

在该包内创建一个接口类 

interface ITelephony{
    boolean endCall();
    void answerRingingCall();
}

创建 aidl 接口

ITelephony.aidl

     

2、Rebuilde项目

配置成功后,在 gen 目录下会有一个包名为com.android.internal.telephony的包   里面有一个 ITelephony.java类   自动生成的

3、在需要挂断电话功能的类添加一个方法     在需要调用该方法的位置时,需要传入一个TelephoneManager对象

原理:通过反射获取aidl代理接口的对象 ITelephony 

  TelephonyManager manager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);

 

4、写一个内部类继承自PhoneStateListener

 class MyPhoneStateListener extends PhoneStateListener {
        /**
         *  * 电话状态改变监听
         *  
         */
        @Override
        public void onCallStateChanged(int state, // 状态常量
                                       String incomingNumber) {
            Log.i("info", "额incomingNumber" + incomingNumber);
            switch (state) {
                case TelephonyManager.CALL_STATE_IDLE:
                    // 空闲
                    Log.i("info", "CALL_STATE_IDLE" + "空闲状态");
                    break;
                case TelephonyManager.CALL_STATE_OFFHOOK:
                    // 接听
                    Log.i("info", "CALL_STATE_OFFHOOK" + "接听状态");
                    break;
                case TelephonyManager.CALL_STATE_RINGING:
                    // 振铃
                    TelephonyManager manager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
                    ITelephony iTelephony;


                    try {
                        iTelephony = getITelephony(manager);
                        if (iTelephony != null) {
                            if (incomingNumber.equals("123")) {

                                //如果号码为123
                                try {
                                    iTelephony.endCall();
                                    Log.i("info", "已挂断" + "  号码为:" + incomingNumber);
                                } catch (RemoteException e) {
                                    e.printStackTrace();
                                }
                            }
                        } else {
                            Log.i("info", "CALL_STATE_RINGING" + "振铃状态" + "ITelephonyManager为空");
                        }

                    } catch (Exception e1) {
                        e1.printStackTrace();
                    }
                    break;
            }
        }
 

6、在Activity生命周期开始时onCreate时 进行广播注册即可

        // 开启电话监听状态
        TelephonyManager manager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
        // 调用listener的监听方法、监听电话状态的方法
        listener = new MyPhoneStateListener();
        manager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);

        // 注册广播接收器
        receiver = new MyPhoneReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_NEW_OUTGOING_CALL);
        registerReceiver(receiver, filter);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值